- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務(wù)經(jīng)營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標記
- 域名注冊服務(wù)機構(gòu)許可:滇D3-20230001
- 代理域名注冊服務(wù)機構(gòu):新網(wǎng)數(shù)碼
程序在運行的時候為了了解運行狀態(tài),會輸出日志文件,時間久了日志文件會變得非常大,甚至達到GB級別。我在golang應(yīng)用里使用logrus包來打日志,配置和使用都很方便,就是沒有日志分割的功能,應(yīng)用在線上運行一個月后日志文件都已經(jīng)達到上百兆。后來發(fā)現(xiàn)了logrotate,這是centos自帶的日志分割工具,都不用安裝額外組件就能實現(xiàn)定時分割日志。
1.運行原理
logrotate由系統(tǒng)的cron運行,位置在/etc/cron.daily/logrotate
1 2 3 4 5 6 7 | #!/bin/sh /usr/sbin/logrotate -s /var/lib/logrotate/logrotate .status /etc/logrotate .conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0 |
可以看到入口配置文件是/etc/logrotate.conf,依次運行/etc/logrotate.conf.d里的配置文件 如果發(fā)現(xiàn)配置的logrotate沒有執(zhí)行,可以看下系統(tǒng)的crond服務(wù)有沒有開啟
2.配置
如果有安裝nginx,可以參考nginx里的配置例子
1 2 3 4 5 6 7 8 9 10 11 12 | /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來匹配所有日志文件。也可以指定多個文件,用空格隔開,比如
1 2 3 | /var/log/nginx/access .log /var/log/nginx/error .log { } |
花括號里面是日志切割相關(guān)的參數(shù),下面是常用的切割參數(shù)
compress 是否開啟壓縮,壓縮格式gzip
不開啟壓縮
compresscmd 自定義壓縮命令
compressexty 壓縮文件名后綴
compressoptions 壓縮選項
copy 復(fù)制一份文件
create 后面跟mode owner group,設(shè)置新日志文件的權(quán)限
daily 按天分割
weekly 按周分割
monthly 按月分割
rotate 后面跟數(shù)字,表示需要保留的文件歷史記錄,超過數(shù)量就會刪除,或者通過郵件發(fā)送
size 后面跟文件大小,比如100k、100M,超過這個大小后分割
missingok 忽略不存在的文件,不報錯
notifempty 不分割空文件
sharedscripts 配合postrotate、prerotate,讓他們只執(zhí)行一次
postrotate/endscript 文件分割完后,執(zhí)行postrotate、endscript之間的命令
prerotate/endscript 文件分割完前,執(zhí)行prerotate、endscript之間的命令
下面看幾個例子
1 2 3 4 5 6 7 8 9 | /var/log/httpd/error .log { rotate 5 mail i@wuyuans.com size=100k sharedscripts postrotate /sbin/killall -HUP httpd endscript } |
切割/var/log/httpd/error.log日志文件,超過100k后切割,保留最新的5個歷史記錄,超過5個的郵件發(fā)送到fss@qq.com,postrotate里的的命令是為了讓httpd重新打開日志文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /var/lib/mysql/mysqld .log { # create 600 mysql mysql notifempty daily rotate 3 missingok compress postrotate # just if mysqld is really running
|