天天看點

logrotate轉儲日志丢了——Linux logrotate的使用注意

注:本文基于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,預設轉儲所有日志,且不保留曆史日志

繼續閱讀