我在 Debian 10 伺服器上遇到了 logrotate 的奇怪問題。
總而言之,logrotate(v3.20.1)工作正常並且旋轉良好......除了 /tmp 中的一些文件我每天都想“skrink”。這些日誌是來自collectd 的cvs 文件,我不需要保留超過24 小時。
我的collectd設定檔是:
/var/log/collectd/collectd.log {
weekly
rotate 4
create
compress
missingok
}
/tmp/collectd/csv/localhost/*/* {
daily
rotate 0
copytruncate
missingok
}
這是 logrotate 日誌檔案的一部分:
rotating pattern: /var/log/collectd/collectd.log weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/collectd/collectd.log
Now: 2022-12-09 00:00
Last rotated at 2022-12-04 15:15
log does not need rotating (log has been rotated at 2022-12-04 15:15, which is less than a week ago)
rotating pattern: /tmp/collectd/csv/localhost/*/* after 1 days (no old logs will be kept)
empty log files are rotated
considering log /tmp/collectd/csv/localhost/*/*
我注意到的奇怪的事情是在 logrotate 狀態檔案 /var/lib/logrotate/status 中,與其他條目不同,這些檔案的狀態日期停留在 2022-12-1-0:0:0 。
# cat /var/lib/logrotate/status | sort
logrotate state -- version 2
"/tmp/collectd/csv/localhost/*/*" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-idle" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-interrupt" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-nice" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/cpu-0/cpu-softirq" 2022-12-1-0:0:0
...
"/tmp/collectd/csv/localhost/tcpconns-4772-remote/tcp_connections-SYN_SENT" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/tcpconns-4772-remote/tcp_connections-TIME_WAIT" 2022-12-1-0:0:0
"/tmp/collectd/csv/localhost/uptime/uptime" 2022-12-1-0:0:0
...
"/var/log/borgbackup.log" 2022-12-4-15:15:18
"/var/log/btmp" 2022-12-1-0:0:1
"/var/log/chrony/*.log" 2022-1-13-18:0:0
"/var/log/clamav/clamav.log" 2022-12-4-15:15:18
"/var/log/clamav/freshclam.log" 2022-12-4-15:15:18
"/var/log/collectd/collectd.log" 2022-12-4-15:15:18
我嘗試在調試模式下運行 logrotate,結果如下:
...
rotating pattern: /tmp/collectd/csv/localhost/*/* after 1 days (no old logs will be kept)
empty log files are rotated
considering log /tmp/collectd/csv/localhost/cpu-0/cpu-idle
Now: 2022-12-09 17:32
Last rotated at 2022-12-01 00:00
log needs rotating
...
rotating log /tmp/collectd/csv/localhost/cpu-0/cpu-idle, log->rotateCount is 0
dateext suffix '-20221209'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /tmp/collectd/csv/localhost/cpu-0/cpu-idle.1.bz2 to /tmp/collectd/csv/localhost/cpu-0/cpu-idle.2.bz2 (rotatecount 1, logstart 1, i 1),
renaming /tmp/collectd/csv/localhost/cpu-0/cpu-idle.0.bz2 to /tmp/collectd/csv/localhost/cpu-0/cpu-idle.1.bz2 (rotatecount 1, logstart 1, i 0),
log /tmp/collectd/csv/localhost/cpu-0/cpu-idle.2.bz2 doesn't exist -- won't try to dispose of it
skip copying /tmp/collectd/csv/localhost/cpu-0/cpu-idle to /tmp/collectd/csv/localhost/cpu-0/cpu-idle.1
truncating /tmp/collectd/csv/localhost/cpu-0/cpu-idle
compressing log with: /bin/lbzip2
...
但該文件不會每天午夜輪換並不斷增長:(
是否可以旋轉 /tmp 中的檔案?看起來這是可能的,但可能有什麼問題呢?
感謝您的幫助。
答案1
您需要檢查/lib/systemd/system/logrotate.service
配置並確保 PrivateTmp
選項設定為false
。
不要忘記systemctl daemon-reload
我剛剛自己發現 Logrotate 不是 Cron 處理的,而是由 Systemd 計時器處理的。年度發現!
答案2
這是我的 logrotate 服務的 systemd conf 檔案。
# cat logrotate.service
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
ConditionACPower=true
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate -v --log=/var/log/logrotate/logrotate.log /etc/logrotate.conf
# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7
# hardening options
# details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
# no ProtectHome for userdir logs
# no PrivateNetwork for mail deliviery
# no ProtectKernelTunables for working SELinux with systemd older than 235
# no MemoryDenyWriteExecute for gzip on i686
PrivateDevices=true
PrivateTmp=false
ProtectControlGroups=true
ProtectKernelModules=true
ProtectSystem=full
RestrictRealtime=true