注:本文基于CentOS 7.2編寫,logrotate版本為logrotate-3.8.6-6.el7.x86_64
logrotate用于日志轉儲,可以根據使用者配置的規則,将日志轉儲,或者删除,防止陳年舊賬占滿磁盤空間。
下面介紹一些注意事項,防止有人掉坑裡。
1、logrotate依賴cron任務執行
我們先看下logrotate這個元件有哪些檔案,
[[email protected] ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
可以看到,logrotate的執行實際是由cron實操的,配置檔案為**/etc/cron.daily/logrotate**,這也就是為什麼logrotate的最小時間精度就是天。
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
通過cron執行logrotate是系統預設的行為,預設的配置為**/etc/logrotate.conf**,該配置裡有兩個比較重要的項,
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
由此我們知道,預設情況下日志每周轉儲一次,儲存4份曆史日志。
2、手動執行logrotate檔案
有時候我們需要手動執行logrotate的某個配置檔案,比如**/etc/logrotate.d/test**,
/var/log/test/my.log {
missingok
notifempty
sharedscripts
postrotate
true
endscript
}
我們可以使用以下指令,
logrotate /etc/logrotate.d/test
不過執行後你有可能會發現以下兩種情況,
A、啥都沒發生,日志還是原來那份日志
B、轉儲後的日志不見了
對于第一種情況,
[[email protected] /var/log/test]# ll -h
-rw-r--r-- 1 root root 928K Jul 15 10:47 my.log
-rw-r--r-- 1 root root 104K Jul 15 10:47 my.log.1
[[email protected] /var/log/test]# cat /etc/logrotate.d/test
/var/log/test/my.log {
missingok
notifempty
sharedscripts
postrotate
true
endscript
}
[[email protected] /var/log/test]# logrotate /etc/logrotate.d/test
[[email protected] /var/log/test]# ll -h
-rw-r--r-- 1 root root 928K Jul 15 10:47 my.log
-rw-r--r-- 1 root root 104K Jul 15 10:47 my.log.1
[[email protected] /var/log/test]#
這是因為預設情況下,logrotate隻會轉儲大于1M的日志,是以日志并沒有發生變化。
再看下第二種情況,
[[email protected] /var/log/test]# ll -h
-rw-r--r-- 1 root root 1.1M Jul 15 10:52 my.log
-rw-r--r-- 1 root root 104K Jul 15 10:47 my.log.1
[[email protected] /var/log/test]# cat /etc/logrotate.d/test
/var/log/test/my.log {
missingok
notifempty
sharedscripts
postrotate
true
endscript
}
[[email protected] /var/log/test]# logrotate /etc/logrotate.d/test
[[email protected] /var/log/test]# ll -h
-rw-r--r-- 1 root root 104K Jul 15 10:47 my.log.2
[[email protected] /var/log/test]#
可見,此時日志大小大于1M,是以發生了轉儲,但是轉儲後的日志不見了,這是因為手動執行某個logrotate配置檔案時,不會加載預設的配置檔案/etc/logrotate.conf,是以此時轉儲的次數rotate為0,也就是不會保留轉儲後的日志,表現出來就是轉儲後的my.log.1被删除,也就出現日志丢失的情況。
3、強制執行logrotate檔案
上面我們說到預設情況下logrotate不會轉儲小于1M的日志,如果一定要轉儲的話,可以使用以下指令,
logrotate -f /etc/logrotate.d/test
但是和上面一樣,如果沒有配置rotate參數的話,轉儲後的日志也是會丢失的。是以我們在編寫logrotate配置檔案時,最好把參數都配置完整,預防萬一。
[[email protected] /var/log/test]# ll -h
-rw-r--r-- 1 root root 104K Jul 15 11:01 my.log
-rw-r--r-- 1 root root 104K Jul 15 10:47 my.log.1
[[email protected] /var/log/test]# cat /etc/logrotate.d/test
/var/log/test/my.log {
rotate 20
missingok
notifempty
sharedscripts
postrotate
true
endscript
}
[[email protected] /var/log/test]# logrotate -f /etc/logrotate.d/test
[[email protected] /var/log/test]# ll -h
-rw-r--r-- 1 root root 104K Jul 15 11:01 my.log.1
-rw-r--r-- 1 root root 104K Jul 15 10:47 my.log.2
[[email protected] /var/log/test]#
總結
下面把上面講述的幾點注意事項小結一下:
1、系統預設使用cron執行logrotate,加載預設配置檔案/etc/logrotate.conf,預設情況下每周轉儲,保留4份曆史日志
2、手動執行logrotate配置檔案不會加載配置檔案/etc/logrotate.conf,預設轉儲大于1M的日志,且不保留曆史日志
3、手動強制執行logrotate配置檔案不會加載配置檔案/etc/logrotate.conf,預設轉儲所有日志,且不保留曆史日志