程序在運行的時候為了了解運行狀態(tài),會輸出日志文件,時間久了日志文件會變得非常大,甚至達到GB級別。我在golang應用里使用logrus包來打日志,配置和使用都很方便,就是沒有日志分割的功能,應用在線上運行一個月后日志文件都已經達到上百兆。后來發(fā)現(xiàn)了logrotate,這是centos自帶的日志分割工具,都不用安裝額外組件就能實現(xiàn)定時分割日志。
1.運行原理
logrotate由系統(tǒng)的cron運行,位置在/etc/cron.daily/logrotate
#!/bin/sh/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.confEXITVALUE=$?if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"fiexit 0
可以看到入口配置文件是/etc/logrotate.conf,依次運行/etc/logrotate.conf.d里的配置文件 如果發(fā)現(xiàn)配置的logrotate沒有執(zhí)行,可以看下系統(tǒng)的crond服務有沒有開啟
2.配置
如果有安裝nginx,可以參考nginx里的配置例子
/var/log/nginx/*log { create 0644 nginx nginx daily rotate 10 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true endscript}
第一行定義的是日志文件的路徑,可以用*通配,一般可以定義成*.log來匹配所有日志文件。也可以指定多個文件,用空格隔開,比如
/var/log/nginx/access.log /var/log/nginx/error.log { }
花括號里面是日志切割相關的參數,下面是常用的切割參數
下面看幾個例子
/var/log/httpd/error.log { rotate 5 mail [email protected] size=100k sharedscripts postrotate /sbin/killall -HUP httpd endscript}
切割/var/log/httpd/error.log日志文件,超過100k后切割,保留最新的5個歷史記錄,超過5個的郵件發(fā)送到[email protected],postrotate里的的命令是為了讓httpd重新打開日志文件。
/var/lib/mysql/mysqld.log { # create 600 mysql mysql notifempty daily rotate 3 missingok compress postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin && / /usr/bin/mysqladmin ping &>/dev/null then /usr/bin/mysqladmin --local flush-error-log / flush-engine-log flush-general-log flush-slow-log fi endscript}
這是對mysql日志的切割,每天一份,忽略空文件,保留最新3份,使用gzip壓縮
/home/wuyuan/log/*.log { su wuyuan wuyuan create 0777 wuyuan wuyuan daily rotate 10 olddir /home/wuyuan/log/old missingok postrotate endscript nocompress}
這是我在用的配置項,對log目錄所有.log文件切割,每天一份,保留10份,新文件設定權限777,歷史文件保留在old目錄里,這樣可以方便查看。因為應用程序用的logrus使用append的方式寫日志,所以不需要重新打開日志文件,這點logrus做得很不錯。
3.測試
寫完配置文件后可以手動執(zhí)行下,來驗證是否可用。
logrotate -f /etc/logrotate.d/wuyuan
其中-f 表示強制執(zhí)行,其他命令可以用help來查看
logrotate --help用法: logrotate [OPTION...] <configfile> -d, --debug Don't do anything, just test (implies -v) -f, --force Force file rotation -m, --mail=command Command to send mail (instead of `/bin/mail') -s, --state=statefile Path of state file -v, --verbose Display messages during rotation -l, --log=STRING Log file --version Display version informationHelp options: -?, --help Show this help message --usage Display brief usage message
沒問題的話日志就會被移到old目錄下,并帶上日期,之前的log文件會被清空
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答