我试图找出为什么 logrotate 在不带标志的情况下运行时仅旋转文件夹中的日志文件子集--force
。手册页logrotate --force
简单地说:
告诉 logrotate 强制轮换,即使它认为没有必要。有时在将新条目添加到 logrotate 配置文件后,或者手动删除旧日志文件后,这很有用,因为将创建新文件,并且日志记录将继续正确进行。
我目前的理论是,这与文件年龄有关,因为未旋转的文件是由不同的应用程序写入的,该应用程序会在每次写入时重置日志文件 ctime。
配置/etc/logrotate.d/
文件如下:
"/var/log/web_app/*.log" {
su www-data www-data
daily
rotate 21
maxsize 2G
compress
dateext
copytruncate
delaycompress
missingok
}
文件logrotate.status
显示(仅注意cgi.log
实际上已经旋转):
"/var/log/web_app/cgi.log" 2019-2-11-6:25:34
"/var/log/web_app/api.log" 2019-2-11-6:0:0
"/var/log/web_app/db.log" 2019-2-11-6:0:0
并logrotate --debug
报告:
rotating pattern: "/var/log/web_app/*.log" after 1 days (21 rotations)
empty log files are rotated, log files >= 2147483648 are rotated earlier, old logs are removed
switching euid to 33 and egid to 33
considering log /var/log/web_app/api.log
log does not need rotating
considering log /var/log/web_app/db.log
log does not need rotating
considering log /var/log/web_app/cgi.log
log does not need rotating
switching euid to 0 and egid to 0
head /var/log/web_app/api.log
显示此日志文件尚未轮换(撰写本文时已有 3 天):
2019-02-08 16:50:54,492 - general (Process1-MainThread) - INFO - Starting instance of WEB_APP
stat
在同一个文件上显示:
File: '/var/log/web_app/api.log'
Size: 6307 Blocks: 16 IO Block: 4096 regular file
Device: ca11h/51729d Inode: 751580 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 33/www-data) Gid: ( 33/www-data)
Access: 2019-02-11 13:17:46.639667970 +0000
Modify: 2019-02-11 09:16:43.779964966 +0000
Change: 2019-02-11 09:16:43.779964966 +0000
Birth: -
答案1
每当日志旋转确定给定文件是否需要旋转,该--force
标志使其无条件回答“是的,这个文件需要旋转”。它只是logrotate
忽略配置的旋转触发器 - 注意年龄并不是唯一可能的触发因素,它的作用方式与尺寸。
如果您知道旋转可以使用--force
,但没有 则无法使用 ,则您可能希望使用--debug
和不使用继续--force
。您将获得每份已处理文件的一行解释。如果你使用,--force
你将看不到解释,因为它们会被跳过(findNeedRotating
参见logrotate.c
)
国旗--force
将不是制作日志旋转如果日志文件已经老化/填满,它会执行任何本来不会执行的操作来触发配置的轮换条件。您只是强制它现在发生 -可能会删除最旧的文件,因此通常要避免重复运行它。