被遗忘的Logrotate
我發現很多人的服務器上都運行著一些諸如每天切分Nginx日志之類的CRON腳本,大家似乎遺忘了Logrotate,爭相發明自己的輪子,這真是讓人沮喪啊!就好比明明身邊躺著現成的性感美女,大家卻忙著自娛自樂,罪過!
Logrotate的介紹
顯而易見,Logrotate是基于CRON來運行的,其腳本是「/etc/cron.daily/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
實際運行時,Logrotate會調用配置文件「/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
# 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 -- we'll rotate them here
/var/log/wtmp {
??? monthly
??? minsize 1M
??? create 0664 root utmp
??? rotate 1
}
# system-specific logs may be also be configured here.
這里的設置可以理解為Logrotate的缺省值,當然了,可以我們在「/etc/logrotate.d」目錄里放置自己的配置文件,用來覆蓋Logrotate的缺省值。
Logrotate的演示
按天保存一周的Nginx日志壓縮文件,配置文件為「/etc/logrotate.d/nginx」:
/usr/local/nginx/logs/*.log {
??? daily
??? dateext
??? compress
??? rotate 7
??? sharedscripts
??? postrotate
??????? kill -USR1 `cat /var/run/nginx.pid`
??? endscript
}
如果你等不及CRON,可以通過如下命令來手動執行:
shell> logrotate -f /etc/logrotate.d/nginx
當然,正式執行前最好通過Debug選項來驗證一下,這對調試也很重要:
shell> logrotate -d -f /etc/logrotate.d/nginx
BTW:類似的還有Verbose選項,這里就不多說了。
Logrotate的疑問
問題:sharedscripts的作用是什么?
大家可能注意到了,我在前面Nginx的例子里聲明日志文件的時候用了星號通配符,也就是說這里可能涉及多個日志文件,比如:access.log和error.log。說到這里大家或許就明白了,sharedscripts的作用是在所有的日志文件都輪轉完畢后統一執行一次腳本。如果沒有配置這條指令,那么每個日志文件輪轉完畢后都會執行一次腳本。
問題:rotate和maxage的區別是什么?
它們都是用來控制保存多少日志文件的,區別在于rotate是以個數為單位的,而maxage是以天數為單位的。如果我們是以按天來輪轉日志,那么二者的差別就不大了。
問題:為什么生成日志的時間是凌晨四五點?
前面我們說過,Logrotate是基于CRON運行的,所以這個時間是由CRON控制的,具體可以查詢CRON的配置文件「/etc/crontab」,可以手動改成如23:59等時間執行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
59 23 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
如果使用的是新版CentOS,那么配置文件為:/etc/anacrontab。
問題:如何告訴應用程序重新打開日志文件?
以Nginx為例,是通過postrotate指令發送USR1信號來通知Nginx重新打開日志文件的。但是其他的應用程序不一定遵循這樣的約定,比如說MySQL是通過flush-logs來重新打開日志文件的。更有甚者,有些應用程序就壓根沒有提供類似的方法,此時如果想重新打開日志文件,就必須重啟服務,但為了高可用性,這往往不能接受。還好Logrotate提供了一個名為copytruncate的指令,此方法采用的是先拷貝再清空的方式,整個過程中日志文件的操作句柄沒有發生改變,所以不需要通知應用程序重新打開日志文件,但是需要注意的是,在拷貝和清空之間有一個時間差,所以可能會丟失部分日志數據。
BTW:MySQL本身在support-files目錄已經包含了一個名為mysql-log-rotate的腳本,不過它比較簡單,更詳細的日志輪轉詳見「Rotating MySQL Slow Logs Safely」。
熟悉Apache的朋友可能會記得cronolog,不過Nginx并不支持它,有人通過mkfifo命令曲線救國,先給日志文件創建管道,再搭配cronolog輪轉,雖然理論上沒有問題,但效率上有折扣。另外,Debian/Ubuntu下有一個簡化版工具savelog,有興趣可以看看。
原創地址:http://huoding.com/2013/04/21/246
轉載于:https://blog.51cto.com/461205160/1741261
總結
以上是生活随笔為你收集整理的被遗忘的Logrotate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android studio 打开git
- 下一篇: HTTP与HTTPS握手的那些事