當前位置:
首頁 > 最新 > Linux下logrotate 日誌輪詢操作梳理

Linux下logrotate 日誌輪詢操作梳理

對於 Linux 系統安全來說,日誌文件是極其重要的工具。不知為何,我發現很多運維同學的伺服器上都運行著一些諸如每天切分 Nginx日誌之類的 CRON 腳本,大家似乎遺忘了 Logrotate,爭相發明自己的輪子,這真是讓人沮喪啊!就好比明明身邊躺著現成的性感美女,大家卻忙著自娛自樂,罪過!

logrotate 程序是一個日誌文件管理工具。用於分割日誌文件,刪除舊的日誌文件,並創建新的日誌文件,起到「轉儲」作用。可以節省磁碟空間。下面就對 logrotate 日誌輪轉操作做一梳理記錄。

1)配置文件介紹

Linux系統默認安裝logrotate工具,它默認的配置文件在:

/etc/logrotate.conf

/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一個目錄,該目錄里的所有文件都會被主動的讀入/etc/logrotate.conf中執行。

另外,如果 /etc/logrotate.d/ 裡面的文件中沒有設定一些細節,則會以/etc/logrotate.conf這個文件的設定來作為默認值。

Logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d目錄里放置自定義好的配置文件,用來覆蓋Logrotate的預設值。

[root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1 EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0

如果等不及cron自動執行日誌輪轉,想手動強制切割日誌,需要加-f參數;不過正式執行前最好通過Debug選項來驗證一下(-d參數),這對調試也很重要:

# /usr/sbin/logrotate -f /etc/logrotate.d/nginx # /usr/sbin/logrotate -d -f /etc/logrotate.d/nginxlogrotate 命令格式:

logrotate [OPTION…]

-d, –debug :debug模式,測試配置文件是否有錯誤。

-f, –force :強制轉儲文件。

-m, –mail=command :壓縮日誌後,發送日誌到指定郵箱。

-s, –state=statefile :使用指定的狀態文件。

-v, –verbose :顯示轉儲過程。

根據日誌切割設置進行操作,並顯示詳細信息:

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf [root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

根據日誌切割設置進行執行,並顯示詳細信息,但是不進行具體操作,debug模式

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf [root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx

查看各log文件的具體執行情況

[root@fangfull_web1 ~]# cat /var/lib/logrotate.status2)切割介紹

比如以系統日誌/var/log/message做切割來簡單說明下:

第一次執行完rotate(輪轉)之後,原本的messages會變成messages.1,而且會製造一個空的messages給系統來儲存日誌;

第二次執行之後,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日誌!

如果僅設定保留三個日誌(即輪轉3次)的話,那麼執行第三次時,則 messages.3這個檔案就會被刪除,並由後面的較新的保存日誌所取代!也就是會保存最新的幾個日誌。

日誌究竟輪換幾次,這個是根據配置文件中的dateext 參數來判定的。

看下logrotate.conf配置:

# cat /etc/logrotate.conf # 底下的設定是 "logrotate 的默認值" ,如果別的文件設定了其他的值, # 就會以其它文件的設定為主 weekly //默認每一周執行一次rotate輪轉工作 rotate 4 //保留多少個日誌文件(輪轉幾次).默認保留四個.就是指定日誌文件刪除之前輪轉的次數,0 指沒有備份 create //自動創建新的日誌文件,新的日誌文件具有和原來的文件相同的許可權;因為日誌被改名,因此要創建一個新的來繼續存儲之前的日誌 dateext //這個參數很重要!就是切割後的日誌文件以當前日期為格式結尾,如xxx.log-20131216這樣,如果注釋掉,切割出來是按數字遞增,即前面說的 xxx.log-1這種格式 compress //是否通過gzip壓縮轉儲以後的日誌文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行 include /etc/logrotate.d # 將 /etc/logrotate.d/ 目錄中的所有文件都載入進來 /var/log/wtmp { //僅針對 /var/log/wtmp 所設定的參數 monthly //每月一次切割,取代默認的一周 minsize 1M //文件大小超過 1M 後才會切割 create 0664 root utmp //指定新建的日誌文件許可權以及所屬用戶和組 rotate 1 //只保留一個日誌. } # 這個 wtmp 可記錄用戶登錄系統及系統重啟的時間 # 因為有 minsize 的參數,因此不見得每個月一定會執行一次喔.要看文件大小。

由這個文件的設定可以知道/etc/logrotate.d其實就是由/etc/logrotate.conf 所規划出來的目錄,雖然可以將所有的配置都寫入 /etc/logrotate.conf ,但是這樣一來這個文件就實在是太複雜了,尤其是當使用很多的服務在系統上面時, 每個服務都要去修改 /etc/logrotate.conf 的設定也似乎不太合理了。

所以,如果獨立出來一個目錄,那麼每個要切割日誌的服務, 就可以獨自成為一個文件,並且放置到 /etc/logrotate.d/ 當中。

其他重要參數說明:

compress 通過gzip 壓縮轉儲以後的日誌 nocompress 不做gzip壓縮處理 copytruncate 用於還在打開中的日誌文件,把當前日誌備份並截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日誌數據。 nocopytruncate 備份日誌文件不過不截斷 create mode owner group 輪轉時指定創建新文件的屬性,如create 0777 nobody nobody nocreate 不建立新的日誌文件 delaycompress 和compress 一起使用時,轉儲的日誌文件到下一次轉儲時才壓縮 nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。 missingok 如果日誌丟失,不報錯繼續滾動下一個日誌 errors address 專儲時的錯誤信息發送到指定的Email 地址 ifempty 即使日誌文件為空文件也做輪轉,這個是logrotate的預設選項。 notifempty 當日誌文件為空時,不進行輪轉 mail address 把轉儲的日誌文件發送到指定的E-mail 地址 nomail 轉儲時不發送日誌文件 olddir directory 轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件在同一個文件系統 noolddir 轉儲後的日誌文件和當前日誌文件放在同一個目錄下 sharedscripts 運行postrotate腳本,作用是在所有日誌都輪轉後統一執行一次腳本。如果沒有配置這個,那麼每個日誌輪轉後都會執行一次腳本 prerotate 在logrotate轉儲之前需要執行的指令,例如修改文件的屬性等動作;必須獨立成行 postrotate 在logrotate轉儲之後需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行 daily 指定轉儲周期為每天 weekly 指定轉儲周期為每周 monthly 指定轉儲周期為每月 rotate count 指定日誌文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份 dateext 使用當期日期作為命名格式 dateformat .%s 配合dateext使用,緊跟在下一行出現,定義文件切割後的文件名,必須配合dateext使用,只支持 %Y %m %d %s 這四個參數 size(或minsize) log-size 當日誌文件到達指定的大小時才轉儲,log-size能指定bytes(預設)及KB (sizek)或MB(sizem). 當日誌文件 >= log-size 的時候就轉儲。 以下為合法格式:(其他格式的單位大小寫沒有試過) size = 5 或 size 5 (>= 5 個位元組就轉儲) size = 100k 或 size 100k size = 100M 或 size 100M

小示例:下面一個切割nginx日誌的配置

[root@master-server ~]# vim /etc/logrotate.d/nginx /usr/local/nginx/logs/*.log { daily rotate 7 missingok notifempty dateext sharedscripts postrotate if [ -f /usr/local/nginx/logs/nginx.pid ]; then kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` fi endscript }

——————–分享一例曾經使用過的nginx日誌切割處理腳本———————–

1)logrotate日誌分割配置:

[root@bastion-IDC ~# vim /etc/logrotate.d/nginx /data/nginx_logs/*.access_log { nocompress daily copytruncate create ifempty olddir /data/nginx_logs/days rotate 0 }2)日誌分割腳本[root@bastion-IDC ~# vim /usr/local/sbin/logrotate-nginx.sh #!/bin/bash #創建轉儲日誌壓縮存放目錄 mkdir -p /data/nginx_logs/days #手工對nginx日誌進行切割轉換 /usr/sbin/logrotate -vf /etc/logrotate.d/nginx #當前時間 time=$(date -d "yesterday" +"%Y-%m-%d") #進入轉儲日誌存放目錄 cd /data/nginx_logs/days #對目錄中的轉儲日誌文件的文件名進行統一轉換 for i in $(ls ./ | grep "^(.*).[[:digit:]]$") do mv $ ./$(echo $|sed -n s/^(.*).([[:digit:]])$/1/p )-$(echo $time) done #對轉儲的日誌文件進行壓縮存放,並刪除原有轉儲的日誌文件,只保存壓縮後的日誌文件。以節約存儲空間 for i in $(ls ./ | grep "^(.*)-([[:digit:]-]+)$") do tar jcvf $.bz2 ./$ rm -rf ./$ done #只保留最近7天的壓縮轉儲日誌文件 find /data/nginx_logs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} ;3)crontab定時執行[root@bastion-IDC ~# crontab -e #logrotate 0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh > /dev/null 2>&1

手動執行腳本,測試下看看:

[root@bastion-IDC ~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh [root@bastion-IDC ~# cd /data/nginx_logs/days [root@bastion-IDC days# ls huantest.access_log-2017-01-18.bz2

———————————-php腳本切割一例———————————-

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/php /Data/logs/php/*log { daily rotate 365 missingok notifempty compress dateext sharedscripts postrotate if [ -f /Data/app/php5.6.26/var/run/php-fpm.pid ]; then kill -USR1 `cat /Data/app/php5.6.26/var/run/php-fpm.pid` fi endscript postrotate /bin/chmod 644 /Data/logs/php/*gz endscript } [root@huanqiu_web1 ~]# ll /Data/app/php5.6.26/var/run/php-fpm.pid -rw-r--r-- 1 root root 4 Dec 28 17:03 /Data/app/php5.6.26/var/run/php-fpm.pid [root@huanqiu_web1 ~]# cd /Data/logs/php [root@huanqiu_web1 php]# ll total 25676 -rw-r--r-- 1 root root 0 Jun 1 2016 error.log -rw-r--r-- 1 nobody nobody 182 Aug 30 2015 error.log-20150830.gz -rw-r--r-- 1 nobody nobody 371 Sep 1 2015 error.log-20150901.gz -rw-r--r-- 1 nobody nobody 315 Sep 7 2015 error.log-20150907.gz ......... .........

———————————-nginx日誌切割一例———————————–

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/nginx /Data/logs/nginx/*/*log { daily rotate 365 missingok notifempty compress dateext sharedscripts postrotate /etc/init.d/nginx reload endscript } [root@huanqiu_web1 ~]# ll /Data/logs/nginx/www.huanqiu.com/ .......... -rw-r--r-- 1 root root 1652 Jan 1 00:00 error.log-20170101.gz -rw-r--r-- 1 root root 1289 Jan 2 00:00 error.log-20170102.gz -rw-r--r-- 1 root root 1633 Jan 3 00:00 error.log-20170103.gz -rw-r--r-- 1 root root 3239 Jan 4 00:00 error.log-20170104.gz

———————————-系統日誌切割一例———————————–

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } [root@huanqiu_web1 ~]# ll /var/log/messages* -rw------- 1 root root 34248975 Jan 19 18:42 /var/log/messages -rw------- 1 root root 51772994 Dec 25 03:11 /var/log/messages-20161225 -rw------- 1 root root 51800210 Jan 1 03:05 /var/log/messages-20170101 -rw------- 1 root root 51981366 Jan 8 03:36 /var/log/messages-20170108 -rw------- 1 root root 51843025 Jan 15 03:40 /var/log/messages-20170115 [root@huanqiu_web1 ~]# ll /var/log/cron* -rw------- 1 root root 2155681 Jan 19 18:43 /var/log/cron -rw------- 1 root root 2932618 Dec 25 03:11 /var/log/cron-20161225 -rw------- 1 root root 2939305 Jan 1 03:06 /var/log/cron-20170101 -rw------- 1 root root 2951820 Jan 8 03:37 /var/log/cron-20170108 -rw------- 1 root root 3203992 Jan 15 03:41 /var/log/cron-20170115 [root@huanqiu_web1 ~]# ll /var/log/secure* -rw------- 1 root root 275343 Jan 19 18:36 /var/log/secure -rw------- 1 root root 2111936 Dec 25 03:06 /var/log/secure-20161225 -rw------- 1 root root 2772744 Jan 1 02:57 /var/log/secure-20170101 -rw------- 1 root root 1115543 Jan 8 03:26 /var/log/secure-20170108 -rw------- 1 root root 731599 Jan 15 03:40 /var/log/secure-20170115 [root@huanqiu_web1 ~]# ll /var/log/spooler* -rw------- 1 root root 0 Jan 15 03:41 /var/log/spooler -rw------- 1 root root 0 Dec 18 03:21 /var/log/spooler-20161225 -rw------- 1 root root 0 Dec 25 03:11 /var/log/spooler-20170101 -rw------- 1 root root 0 Jan 1 03:06 /var/log/spooler-20170108 -rw------- 1 root root 0 Jan 8 03:37 /var/log/spooler-20170115

———————————-tomcat日誌切割一例———————————–

[root@huanqiu-backup ~]# cat /etc/logrotate.d/tomcat /Data/app/tomcat-7-huanqiu/logs/catalina.out { rotate 14 daily copytruncate compress notifempty missingok } [root@huanqiu-backup ~]# ll /Data/app/tomcat-7-huanqiu/logs/catalina.* -rw-r--r--. 1 root root 0 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out -rw-r--r--. 1 root root 95668 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

———————————早期用過的nginx日誌處理一例———————————-

[root@letv-backup ~]# vim /letv/sh/cut_nginx_log.sh #!/bin/bash # 你的日誌文件存放目錄 logs_path="/letv/logs/" # 日誌文件的名字,多個需要空格隔開 logs_names=(error access pv_access) dates=`date -d "yesterday" +"%Y%m%d"` mkdir -p $$dates/ num=${#logs_names[@]} for((i=0;i /dev/null 2>$13)嘗試解決logrotate無法自動輪詢日誌的辦法

現象說明:

使用logrotate輪詢nginx日誌,配置好之後,發現nginx日誌連續兩天沒被切割,這是為什麼呢??

然後開始檢查日誌切割的配置文件是否有問題,檢查後確定配置文件一切正常。

於是懷疑是logrotate預定的cron沒執行,查看了cron的日誌,發現有一條Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)這樣的日誌,證明cron在04:02分時已經執行/etc/cron.daily目錄下的程序。

接著查看/etc /cron.daily/logrotate(這是logrotate自動輪轉的腳本)的內容:

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1 EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0

沒有發現異常,配置好的日誌輪轉操作都是由這個腳本完成的,一切運行正常,腳本應該就沒問題。

直接執行命令:

[root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

這些系統日誌是正常輪詢了,但nginx日誌卻還是沒輪詢。

接著強行啟動記錄文件維護操作,縱使logrotate指令認為沒有需要,應該有可能是logroate認為nginx日誌太小,不進行輪詢。

故需要強制輪詢,即在/etc/cron.daily/logrotate腳本中將 -t 參數替換成 -f 參數

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1 EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0

最後最後重啟下cron服務:

[root@huanqiu_test ~]# /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ]

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

漫山遍野的多邊形元素,正在入侵每一份設計稿
Stata 15發布,支持markdown!
原生JS發送非同步數據請求
知識付費產品盤點,哪款治好了你的焦慮?
Redis集群實現原理探討

TAG:推酷 |

您可能感興趣

《Marketing Management》思維梳理
TKT每日梳理-Unit 11 The role of error
Google、Facebook還是Amazon?一文梳理各大內容分發平台優缺點
Facebook 投資邏輯梳理
Citadis系列有軌電車梳理
Combino系列有軌電車梳理
大吉大利,四月吃雞!《Gun Gale Online》深度梳理
褶子科學家Issey Miyake 的寫意梳理
梳理Python基本認識基本類型,Python學習經驗分享
WeGame《怪物獵人:世界》下架,時間線梳理5天就夭折的Wegame究竟經歷了什麼?
iOS 13 beta 6已知系統問題梳理!
頭髮打結難梳理?凱特王妃同款Tangle Teezer美髮梳一梳就順!
雷軍宣布小米CC系列,梳理產品線,網友急問note和max呢
Cytus2劇情梳理Nora篇:身處深淵,天才少女的自我拯救
TKT每日梳理-Unit 8 口語
如何閱讀Android項目的源碼,快速梳理程序主線
李光洙官宣承認戀情,RunningMan情侶成真!戀情細節全梳理!
雷軍梳理手機產品線:保留三個系列,小米Max、Note成棄子
iOS 13 Bug 梳理,僅系統部分就有這麼多!
2分鐘梳理JYP邪教boss質疑,「救援派」到底是一種怎樣的存在?