關于日志切割
日志檔案包含了關于系統中發生的事件的有用資訊,在排障程序中或者系統性能分析時經常被用到,對于忙碌的服務器,日志檔案大小會增長極快,服務器會很快消耗磁盤空間,這成了個問題,除此之外,處理一個單個的龐大日志檔案也常常是件十分棘手的事,
logrotate是個十分有用的工具,它可以自動對日志進行截斷(或輪循)、壓縮以及洗掉舊的日志檔案,例如,你可以設定logrotate,讓/var/log/foo日志檔案每30天輪循,并洗掉超過6個月的日志,配置完后,logrotate的運作完全自動化,不必進行任何進一步的人為干預,
安裝logrotate
系統版本說明
[root@nfsnobody ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@nfsnobody ~]# uname -r
2.6.32-696.el6.x86_64
默認centos系統安裝自帶logrotate,安裝方法如下
yum -y install logrotate crontabs
軟體包資訊說明
[root@nfsnobody ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf # 主組態檔
/etc/logrotate.d # 配置目錄
logrotate的組態檔是/etc/logrotate.conf,通常不需要對它進行修改,日志檔案的輪循設定在獨立的組態檔中,它(們)放在/etc/logrotate.d/目錄下,
實踐配置logrotate
測驗logrotate如何管理日志
這里我們將創建一個10MB的日志檔案/var/log/log-file,我們將展示怎樣使用logrotate來管理該日志檔案,
從創建一個日志檔案開始,然后在其中填入一個10MB的隨機位元流資料檔案,
[root@nfsnobody ~]# touch /var/log/log-file
[root@nfsnobody ~]# head -c 10M < /dev/urandom > /var/log/log-file
由于現在日志檔案已經準備好,我們將配置logrotate來輪循該日志檔案,讓我們為該檔案創建一個組態檔,
[root@nfsnobody ~]# vim /etc/logrotate.d/log-file
/var/log/log-file {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
上面的模板是通用的,而配置引數則根據你的需求進行調整,不是所有的引數都是必要的,也可以通過man手冊中的例子進行配置,
組態檔說明
| 配置引數 | 說明 |
|---|---|
| monthly | 日志檔案將按月輪循,其它可用值為'daily','weekly'或者'yearly', |
| rotate 5 | 一次將存盤5個歸檔日志,對于第六個歸檔,時間最久的歸檔將被洗掉, |
| compress | 在輪循任務完成后,已輪循的歸檔將使用gzip進行壓縮, |
| delaycompress | 總是與compress選項一起用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循周期進行,這在你或任何軟體仍然需要讀取最新歸檔時很有用, |
| missingok | 在日志輪循期間,任何錯誤將被忽略,例如“檔案無法找到”之類的錯誤, |
| notifempty | 如果日志檔案為空,輪循不會進行, |
| create 644 root root | 以指定的權限創建全新的日志檔案,同時logrotate也會重命名原始日志檔案, |
| postrotate/endscript | 在所有其它指令完成后,postrotate和endscript里面指定的命令將被執行,在這種情況下,rsyslogd 行程將立即再次讀取其配置并繼續運行, |
| 以上資訊來源 "man logrotate" |
手動運行logrotate
logrotate可以在任何時候從命令列手動呼叫,要呼叫為/etc/lograte.d/下配置的所有日志呼叫logrotate:
[root@nfsnobody ~]# logrotate /etc/logrotate.conf
要為某個特定的配置呼叫logrotate,執行一次切割任務測驗
[root@nfsnobody ~]# ll /var/log/log-file
-rw-r--r-- 1 root root 10485760 Feb 7 18:50 /var/log/log-file
[root@nfsnobody ~]# logrotate -vf /etc/logrotate.d/log-file
[root@nfsnobody ~]# ll /var/log/log-file*
-rw-r--r-- 1 root root 0 Feb 7 19:17 /var/log/log-file
-rw-r--r-- 1 root root 10485760 Feb 7 18:50 /var/log/log-file.1
即使輪循條件沒有滿足,我們也可以通過使用‘-f’選項來強制logrotate輪循日志檔案,‘-v’引數提供了詳細的輸出,
Logrotate的記錄日志
logrotate自身的日志通常存放于/var/lib/logrotate/status目錄,如果處于排障目的,我們想要logrotate記錄到任何指定的檔案,我們可以指定像下面這樣從命令列指定,
[root@nfsnobody ~]# logrotate -vf -s /var/log/logrotate-status /etc/logrotate.d/log-file
reading config file /etc/logrotate.d/log-file
reading config info for /var/log/log-file
Handling 1 logs
rotating pattern: /var/log/log-file forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/log-file
log does not need rotating
not running postrotate script, since no logs were rotated
Logrotate定時任務
logrotate需要的cron任務應該在安裝時就自動創建了,我把cron檔案的內容貼出來,以供大家參考,
[root@nfsnobody ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=https://www.cnblogs.com/wenrulaogou/p/$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate"ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
Logrotate生產應用
為nginx設定日志切割
防止訪問日志檔案過大
[root@nfsnobody nginx]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 5
missingok
notifempty
create 644 www www
postrotate
if [ -f /application/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /application/nginx/logs/nginx.pid`
fi
endscript
}
logrotate工具對于防止因龐大的日志檔案而耗盡存盤空間是十分有用的,配置完畢后,行程是全自動的,可以長時間在不需要人為干預下運行,本教程重點關注幾個使用logrotate的幾個基本樣例,你也可以定制它以滿足你的需求,
對于其他服務日志切割后續補充
**
附錄
關于USR1信號解釋
摘自: http://www.xuebuyuan.com/323422.html
USR1亦通常被用來告知應用程式多載組態檔;
例如,向Apache HTTP服務器發送一個USR1信號將導致以下步驟的發生:
停止接受新的連接,等待當前連接停止,重新載入組態檔,重新打開日志檔案,重啟服務器,
從而實作相對平滑的不關機的更改,
內容摘自wiki:http://zh.wikipedia.org/wiki/SIGUSR1%E5%92%8CSIGUSR2
對于USR1和2都可以用戶自定義的,在POSIX兼容的平臺上,SIGUSR1和SIGUSR2是發送給一個行程的信號,它表示了用戶定義的情況,它們的符號常量在頭檔案signal.h中定義,在不同的平臺上,信號的編號可能發生變化,因此需要使用符號名稱,
kill -HUP pid 或者 killall -HUP pName:
其中pid是行程標識,pName是行程的名稱,
如果想要更改配置而不需停止并重新啟動服務,可以使用上面兩個命令,在對組態檔作必要的更改后,發出該命令以動態更新服務配置,根據約定,當你發送一個掛起信號(信號1或HUP)時,大多數服務器行程(所有常用的行程)都會進行復位操作并重新加載它們的組態檔,
常見配置引數小結
| 配置引數 | 說明 |
|---|---|
| compress | 通過gzip壓縮轉儲以后的日志 |
| nocompress | 不壓縮 |
| copytruncate | 用于還在打開中的日志檔案,把當前日志備份并截斷 |
| nocopytruncate | 備份日志檔案但是不截斷 |
| create mode owner group | 轉儲檔案,使用指定的檔案模式創建新的日志檔案 |
| nocreate | 不建立新的日志檔案 |
| delaycompress | 和compress 一起使用時,轉儲的日志檔案到下一次轉儲時才壓縮 |
| nodelaycompress | 覆寫 delaycompress選項,轉儲同時壓縮, |
| errors address | 專儲時的錯誤資訊發送到指定的Email 地址 |
| ifempty | 即使是空檔案也轉儲,這個是logrotate 的預設選項, |
| notifempty | 如果是空檔案的話,不轉儲 |
| mail address | 把轉儲的日志檔案發送到指定的E-mail地址 |
| nomail | 轉儲時不發送日志檔案 |
| olddir directory | 轉儲后的日志檔案放入指定的目錄,必須和當前日志檔案在同一個檔案系統 |
| noolddir | 轉儲后的日志檔案和當前日志檔案放在同一個目錄下 |
| prerotate/endscript | 在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行 |
| daily | 指定轉儲周期為每天 |
| weekly | 指定轉儲周期為每周 |
| monthly | 指定轉儲周期為每月 |
| rotate count | 指定日志檔案洗掉之前轉儲的次數,0指沒有備份,5 指保留5 個備份 |
| tabooext [+] list | 讓logrotate不轉儲指定擴展名的檔案,預設的擴展名是:.rpm-orig, .rpmsave, v, 和 ~ |
| size size | 當日志檔案到達指定的大小時才轉儲,bytes(預設)及KB(sizek)或MB(sizem) |
| missingok | 在日志輪循期間,任何錯誤將被忽略,例如“檔案無法找到”之類的錯誤, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/143440.html
標籤:Linux
上一篇:Bash腳本編程學習筆記04:測驗命令test、狀態回傳值、位置引數和特殊變數
下一篇:docker常見操作總結
