Logrotate

Logrotate 無法按預期工作

  • October 7, 2015

我的 CentOS 6 安裝中 httpd 的預設 logrotate 規則如下所示:

[root@myVM ~]# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
   missingok
   notifempty
   sharedscripts
   delaycompress
   postrotate
       /sbin/service httpd reload > /dev/null 2>/dev/null || true
   endscript
}

此外,預設情況下,logrotate cron 會在每個午夜執行一次。我想更改 logrotate,使其像現在一樣工作,而且如果 error.log 的大小達到 100M,它將被壓縮。

為了做到這一點,我嘗試以下方法:

(i) 創建/etc/logrotate.d/httpd_error配置文件:

[root@myVM ~]# cat  /etc/logrotate.d/httpd_error 
/var/log/httpd/error_log {
   missingok
   notifempty
   size 100M
   sharedscripts
   delaycompress
   postrotate
       /sbin/service httpd reload > /dev/null 2>/dev/null || true
   endscript
}

(ii) 創建一個 cron 動作,它將/usr/sbin/logrotate /etc/logrotate.d/httpd_error每分鐘執行一次

但是它不起作用,當我生成日誌文件並手動執行時,/usr/sbin/logrotate -d /etc/logrotate.d/httpd_error我得到:

[root@myVM ~]# perl -e 'print "error error error" x 10000 for 1..1000 ;' > /var/log/httpd/error_log 
[root@myVM ~]# ls -al /var/log/httpd/error_log                                                      
-rwxrwxrwx. 1 root root 170000000 2015-10-07 04:10 /var/log/httpd/error_log
[root@myVM ~]# /usr/sbin/logrotate -d /etc/logrotate.d/httpd_error 
reading config file /etc/logrotate.d/httpd_error
reading config info for /var/log/httpd/error_log 

Handling 1 logs

rotating pattern: /var/log/httpd/error_log  104857600 bytes (no old logs will be kept)
empty log files are not rotated, old logs are removed
considering log /var/log/httpd/error_log
 log needs rotating
rotating log /var/log/httpd/error_log, log->rotateCount is 0
dateext suffix '-20151007'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/httpd/error_log.1 to /var/log/httpd/error_log.2 (rotatecount 1, logstart 1, i 1), 
renaming /var/log/httpd/error_log.0 to /var/log/httpd/error_log.1 (rotatecount 1, logstart 1, i 0), 
renaming /var/log/httpd/error_log to /var/log/httpd/error_log.1
disposeName will be /var/log/httpd/error_log.1
running postrotate script
running script with arg /var/log/httpd/error_log : "
       /sbin/service httpd reload > /dev/null 2>/dev/null || true
"
removing old log /var/log/httpd/error_log.1
error: error opening /var/log/httpd/error_log.1: No such file or directory

我究竟做錯了什麼?

如果它是相關的,我logrotate.conf看起來像這樣:

[root@myVM ~]# cat /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

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
   monthly
   create 0664 root utmp
       minsize 1M
   rotate 1
}

/var/log/btmp {
   missingok
   monthly
   create 0600 root utmp
   rotate 1
}

您在這裡的錯誤是嘗試僅執行配置(/usr/sbin/logrotate -d /etc/logrotate.d/httpd_error)的一部分,其中沒有任何輪換。你忽略了你的logrotate.conf.

採用:

/usr/sbin/logrotate -d /etc/logrotate.conf

所以你實際上得到了旋轉設置。

引用自:https://serverfault.com/questions/727215