我有一个 nginx 实例,该实例设置为将访问记录到 /var/log/nginx/access.log 并将错误记录到 /var/log/nginx/errors.log,但是一旦 logrotate 每周运行,文件就会移动到*.log.1 和新的 *.log 文件被创建,但 nginx 继续记录到 log.1 文件而不是新的 .log 文件(并且没有任何内容被压缩)。我第一次注意到这一点,自日志轮换以来已经过去了 3 周,并且日志变得越来越大。运行kill -HUP `cat /run/nginx.pid`使 nginx 再次开始记录到正确的位置,但问题在下周再次出现。
这令人沮丧的更重要的原因是我将日志设置为通过 rsyslog 上传到 Loggly,当 nginx 停止记录到文件时,我有 rsyslog 轮询,然后事情停止上传,我没有收到任何警报。
我怀疑这与重新启动 nginx 或重新加载配置有关,因为它直到我进行了配置更改并以我认为正常的方式重新加载配置后才启动。我尝试运行,kill -USR1 `cat /run/nginx.pid`但文件继续记录到错误的位置,直到我运行kill -HUP `cat /run/nginx.pid`,我已经知道这不能解决问题。
知道发生了什么吗?我承认我不是 logrotate 或 nginx 管理方面的专家,但我的谷歌在这方面失败了。
这是我的 nginx logrotate 脚本,如果您还有什么想看的,请告诉我。除了定义输出位置之外,nginx.conf 在日志记录方面没有什么特别之处。
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts …Run Code Online (Sandbox Code Playgroud) 我正在使用默认的 rsyslog 和 logrotate 实用程序在 Ubuntu 14 上工作。
在默认的 rsyslog logrotate/etc/logrotate.d/rsyslog配置中,我看到以下内容:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Run Code Online (Sandbox Code Playgroud)
据我了解,建议在所有 logrotate 场景中使用 copytruncate,因为它不会移动当前日志,而是截断日志,因此任何具有打开文件处理程序的进程都能够继续写入它。
那么默认配置如何使用 rsyslog 重新加载功能呢?
我们使用 tail 来连续监视多个日志,但是当日志旋转时,该文件的尾部将停止。
据我了解,问题是当日志轮换时,会创建一个新文件,而正在运行的尾部进程对该新文件句柄一无所知。
我有一个简单的脚本,它输出一堆日志到屏幕上,我将 STDOUT 通过管道传输到一个文件来存储日志。由于这个脚本运行时间很长,我需要轮换日志文件,以便将它们放入更小的更易于管理的文件中。
我面临的问题是,一旦logrotate将当前日志文件移动到一个新文件中,新创建的日志文件就不再填充日志了。似乎一旦原始日志文件被删除,它的文件处理程序就会丢失并且重定向将不再起作用。
我还发现这篇文章与我有同样的问题,并声称可以通过使用>>而不是>重定向输出来修复它。我测试了他的解决方案,但对我不起作用。有谁知道如何保持重定向工作?
我有一个备份脚本,可以压缩各种文件和目录并创建 .tgz 档案。文件被命名,例如
...
backup_2010-10-28.tar.gz
backup_2010-10-29.tar.gz
backup_2010-10-30.tar.gz
backup_2010-10-31.tar.gz
backup_2010-11-01.tar.gz
Run Code Online (Sandbox Code Playgroud)
我想管理这些文件,以便只保留最后 5 个备份,并删除旧文件。
我可以使用 logrotate 来做到这一点吗?它们不是日志文件并且已经被压缩。它们位于 /root 而不是 /var/log - 我还能使用它吗?
谢谢
众所周知,“unix”可以在文件中包含除 '/' 和 '\0' 之外的任何内容,但是系统管理员的偏好要小得多,主要是因为不喜欢空格作为输入...... ':' 和 '@' 等的特殊含义。
最近我看到了另一个案例,在文件名中使用了时间戳,在玩了一些不同的格式以使其“更好”之后,我想我会尝试找到一种“最佳实践”,但没有看到我认为的我只是在这里问一下,看看人们是怎么想的。
可能的“常见”解决方案(p=prefix 和 s=suffix):
syslog/logrotate/DNS 类似格式:
p-%Y%m%d-suffix = prefix-20110719-s
p-%Y%m%d%H%M-suffix = prefix-201107191732-s
p-%Y%m%d%H%M%S-suffix = prefix-20110719173216-s
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
ISO-8601-格式
p-%Y-%m-%d-s = p-2011-07-19-s
p-%Y-%m-%dT%H:%M%z-s = p-2011-07-19T17:32-0400-s
p-%Y-%m-%dT%H:%M:%S%z-s = p-2011-07-19T17:32:16-0400-s
p-%Y-%m-%dT%H:%M:%S%z-s = p-2011-07-19T23:32:16+0200-s
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
RFC-3339 格式
p-%Y-%m-%d-s = p-2011-07-19-s
p-%Y-%m-%d %H:%M%:z-s = p-2011-07-19 17:32-04:00-s
p-%Y-%m-%d %H:%M:%S%:z-s = p-2011-07-19 17:32:16-04:00-s
p-%Y-%m-%d %H:%M:%S%:z-s …Run Code Online (Sandbox Code Playgroud)从 logrotate 的手册页:
minsize size
日志文件在大于 size 字节时轮换,但不会在额外指定的时间间隔(每天、每周、每月或每年)之前轮换。相关的大小选项类似,只是它与时间间隔选项互斥,并且它会导致日志文件轮换而不考虑上次轮换时间。使用 minsize 时,会同时考虑日志文件的大小和时间戳。size size
日志文件在增长到大于 size 字节时进行轮换。如果 size 后跟 k,则假定大小以千字节为单位。如果使用M,则大小以兆字节为单位,如果使用G,则大小以千兆字节为单位。所以大小 100、大小 100k、大小 100M 和大小 100Gare 都是有效的。
我将大小设置为5M,将间隔设置为每周,认为日志将每周轮换一次,如果日志的大小超过 5M,则会发生额外的轮换。但是发生的情况是日志不会被轮换,除非它超过 5M,这似乎是minsize应该做的。
我是否错误地解释了手册?如果日志超过 5M,如何让日志每周轮换一次?
编辑:
我不确定以下信息是否相关,仅作为补充:
我正在使用 rsyslog 对消息、安全、cron、邮件日志、引导进行主要日志记录。以下是倒数第二个日志的轮换日期和文件大小,其中大小和间隔的设置如上所述:
filename rotation date file size
messages 20130129 5.3MB
secure 20130113 5.1kB
cron 20130113 3.6kB
maillog 20130113 1.1kB
Run Code Online (Sandbox Code Playgroud)
可以看出,只有消息被轮换。
编辑2:
我应该检查一下man logrotate。他们实际上使用maxsize选项升级了它。这应该是我正在寻找的:
maxsize size
当日志文件在额外指定的时间间隔(每天、每周、每月或每年)之前增长超过 size 字节时,它们会被轮换。相关的大小选项类似,只是它与时间间隔选项互斥,并且它会导致日志文件轮换而不考虑上次轮换时间。使用 maxsize 时,会同时考虑日志文件的大小和时间戳。
我正在尝试让 logrotate 在我的 VPS 上工作以每周轮换我的 apache 文件。目前 apache2 配置文件的内容是这样的。
"/var/www/user/site.com/logs/*.log" {
weekly
missingok
rotate 8
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
}
Run Code Online (Sandbox Code Playgroud)
我已经离开它两个星期了,据我所知,一切都没有改变。当我从命令行模拟它时,我得到以下输出。
user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log"
Handling 1 logs
rotating pattern: "/var/www/user/site.com/logs/*.log" weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
log does not need rotating
considering log /var/www/user/site.com/logs/error.log
log does not need rotating
not …Run Code Online (Sandbox Code Playgroud) 我注意到正在创建的邮件日志是/var/log由 root(用户和组)创建和拥有的。我写了一个监控日志的 Nagios 检查,为了允许 Nagios 用户访问它,我给了other组读取权限,即:
chmod o+r /var/log/maillog
Run Code Online (Sandbox Code Playgroud)
现在想想,这只是一个日志文件,当日志文件被填满时,日志轮换机制会重命名这个文件并打开一个新maillog文件,但新文件不会有read write我允许的。
所以我的问题是,如何确保日志轮换机制将为 Nagios 用户创建具有正确权限的所有新邮件日志文件?
提前致谢
logrotate ×10
linux ×5
log-files ×4
filesystems ×1
logging ×1
monitoring ×1
nginx ×1
redirect ×1
rsyslog ×1
tail ×1
ubuntu ×1
unix ×1
web-server ×1