我的一台服务器最近空间不足。所以我开始研究它。日志占用了分区的nginx
一半。另外,我注意到一件奇怪的事情。对于很多网站(60%)存在额外的旋转(example.com-access.log.53.gz
当rotate 52
)。大多数最大的——但不是全部——只有两次旋转:
example.com-access.log
example.com-access.log.53.gz
50% 的原木只有这两个轮换。有时旋转中只有孔(30%):一个文件或更多。*.log.1
经常失踪(25%)。*.log.1
有时两者都有*.log.1.gz
(172 个中有 2 个)。
你能解释一下这个缺失/重复的旋转吗?*.log
+ *.log.53.gz
case 让我觉得在某些时候它无法旋转*.log.1
到*.log.2.gz
. 但是不成功后不会停止gzip
吗?那么一定没有孔。或者至少必须*.log.1
存在,如果它不存在,不是吗?
如果有的话,我正在运行 Debian 服务器。
/etc/logrotate.conf
:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
/etc/logrotate.d/nginx
:
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
size 50M
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
/etc/logrotate.d/httpd-prerotate
不存在。
tl;dr
gzip
如果压缩 ( ) 被中断,可能会产生重复。一个这样的副本(如果sharedscripts
)使它最终只留下一个压缩旋转(#rotate + 1
)。这是幕后发生的事情的简化版本(日志集是配置中的一个条目
/path/to/dir/*.log {...}
):因此,
sharedscripts
通常在处理属于日志集的日志文件时发生错误,会停止对整个日志集的处理。没有它,只会停止处理一个日志文件。但是不存在的 gzipped 旋转或日志文件的第一次旋转不算作错误。当日志文件本身不存在时
missingok
,情况并非如此(在模式的情况下无关紧要)。prerotateSingleLog()
阶段中的错误sharedscripts
也不会破坏循环。请注意,我在编译上面的代码时做了很多简化。如有疑问,请查阅原件。
有了这个,我可以看到可能丢失或额外文件的唯一情况是何时
logrotate
被中断。这可能解释rotate + 1
了旋转(gzipped 旋转已重命名,但最后一个尚未删除)。此外,当gzip
被中断时,它会将目标文件留在后面。这解释了同时具有*.log.1
和*.log.1.gz
旋转。仍然没有解释旋转中的孔。UPD出现重复(
*.log.1
+*.log.1.gz
)会产生 错误 :阶段后停止处理
prerotateSingleLog()
。那时,所有 gzipped 旋转都被重命名。但是会跳过重命名*.log -> *.log.1
和删除。变得越来越大,最终你会耗尽空间。*.log.${rotate + 1}.gz
*.log
这解释了除了缺少
*.log.1
旋转之外的一切。但可能和它一样好。因此,请注意日志轮换中的错误。
logrotate
您可以通过在(甚至是非详细)输出中发现“错误:”行来识别问题。作为奖励,一个以很好的方式显示日志目录内容的脚本(自然排序,大小):
还有一个让你检查你是否遇到了我遇到的问题: