Linux日誌文件總管——logrotate

日誌文件包含了關於系統中發生的事件的有用信息,在排障過程當中或者系統性能分析時常常被用到。對於忙碌的服務器,日誌文件大小會增加極快,服務器會很快消耗磁盤空間,這成了個問題。除此以外,處理一個單個的龐大日誌文件也經常是件十分棘手的事。vim

logrotate是個十分有用的工具,它能夠自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌文件。例如,你能夠設置logrotate,讓 /var/log/foo日誌文件每30天輪循,並刪除超過6個月的日誌。配置完後,logrotate的運做徹底自動化,沒必要進行任何進一步的人爲幹 預。另外,舊日誌也能夠經過電子郵件發送,不過該選項超出了本教程的討論範圍。bash

主流Linux發行版上都默認安裝有logrotate包,若是出於某種緣由,logrotate沒有出如今裏頭,你可使用apt-get或yum命令來安裝。服務器

在Debian或Ubuntu上:dom

apt-get install logrotate cron

logrotate的配置文件是/etc/logrotate.conf,一般不須要對它進行修改。日誌文件的輪循設置在獨立的配置文件中,它(們)放在/etc/logrotate.d/目錄下。ide

樣例一

在第一個樣例中,咱們將建立一個10MB的日誌文件/var/log/log-file。咱們將展現怎樣使用logrotate來管理該日誌文件。工具

咱們從建立一個日誌文件開始吧,而後在其中填入一個10MB的隨機比特流數據。post

# touch /var/log/log-file
# head -c 10M < /dev/urandom > /var/log/log-file

因爲如今日誌文件已經準備好,咱們將配置logrotate來輪循該日誌文件。讓咱們爲該文件建立一個配置文件。性能

# 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
}

 

這裏:ui

  • monthly: 日誌文件將按月輪循。其它可用值爲‘daily’,‘weekly’或者‘yearly’。spa

  • rotate 5: 一次將存儲5個歸檔日誌。對於第六個歸檔,時間最久的歸檔將被刪除。

  • compress: 在輪循任務完成後,已輪循的歸檔將使用gzip進行壓縮。

  • delaycompress: 老是與compress選項一塊兒用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循週期進行。這在你或任何軟件仍然須要讀取最新歸檔時頗有用。

  • missingok: 在日誌輪循期間,任何錯誤將被忽略,例如「文件沒法找到」之類的錯誤。

  • notifempty: 若是日誌文件爲空,輪循不會進行。

  • create 644 root root: 以指定的權限建立全新的日誌文件,同時logrotate也會重命名原始日誌文件。

  • postrotate/endscript: 在全部其它指令完成後,postrotate和endscript裏面指定的命令將被執行。在這種狀況下,rsyslogd 進程將當即再次讀取其配置並繼續運行。

上面的模板是通用的,而配置參數則根據你的需求進行調整,不是全部的參數都是必要的。

若是出現以下錯誤

error: skipping "/var/log/smvp/he.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation

則在配置文件末尾增長 su root

樣例二

在本例中,咱們只想要輪循一個日誌文件,然而日誌文件大小能夠增加到50MB。

# vim /etc/logrotate.d/log-file
/var/log/log-file {    
    size=50M    
    rotate 5    
    create 644 root root    
    postrotate        
        /usr/bin/killall -HUP rsyslogd    
    endscript
}

 

樣例三

咱們想要讓舊日誌文件以建立日期命名,這能夠經過添加dateext常熟實現。

# vim /etc/logrotate.d/log-file
/var/log/log-file {    
    monthly    
    rotate 5    
    dateext   
    create 644 root root   
    postrotate       
    /usr/bin/killall -HUP rsyslogd    
    endscript
}

 

 

這將讓歸檔文件在它們的文件名中包含日期信息。

排障

這裏提供了一些logrotate設置的排障提示。

1. 手動運行logrotate

logrotate能夠在任什麼時候候從命令行手動調用。

要調用爲/etc/lograte.d/下配置的全部日誌調用logrotate

# logrotate /etc/logrotate.conf

要爲某個特定的配置調用logrotate:

# logrotate /etc/logrotate.d/log-file

2. 演練

排障過程當中的最佳選擇是使用‘-d’選項以預演方式運行logrotate。要進行驗證,不用實際輪循任何日誌文件,能夠模擬演練日誌輪循並顯示其輸出。

# logrotate -d /etc/logrotate.d/log-file

正如咱們從上面的輸出結果能夠看到的,logrotate判斷該輪循是沒必要要的。若是文件的時間小於一天,這就會發生了。

3. 強制輪循

即便輪循條件沒有知足,咱們也能夠經過使用‘-f’選項來強制logrotate輪循日誌文件,‘-v’參數提供了詳細的輸出。

# logrotate -vf /etc/logrotate.d/log-file
reading config file /etc/logrotate.d/log-filereading 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 rotated, old logs are removedconsidering log /var/log/log-file  
log needs rotatingrotating log /var/log/log-file, log->rotateCount is 5dateext suffix '-20140916'glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'renaming /var/log/log-file.5.gz to 
/var/log/log-file.6.gz (rotatecount 5, logstart 1, i 5),old log /var/log/log-file.5.gz does not existrenaming /var/log/log-file.4.gz to /var/log/log-file.5.gz (rotatecount 5, logstart 1, i 4)
,old log /var/log/log-file.4.gz does not exist. . .renaming /var/log/log-file.0.gz to /var/log/log-file.1.gz (rotatecount 5, logstart 1, i 0),old log /var/log/log-file.0.gz does not existlog 
/var/log/log-file.6.gz doesn't exist -- won't try to dispose of itrenaming /var/log/log-file to /var/log/log-file.1creating new /var/log/log-file mode = 0644 uid = 0 gid = 0running postrotate scriptcompressing log with: /bin/gzip

4. Logrotate的記錄日誌

logrotate自身的日誌一般存放於/var/lib/logrotate/status目錄。若是處於排障目的,咱們想要logrotate記錄到任何指定的文件,咱們能夠指定像下面這樣從命令行指定。

# logrotate -vf –s /var/log/logrotate-status /etc/logrotate.d/log-file

5. Logrotate定時任務

logrotate須要的cron任務應該在安裝時就自動建立了,我把cron文件的內容貼出來

# cat /etc/cron.daily/logrotate
#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
/usr/sbin/logrotate /etc/logrotate.d/log-file

小結一下,logrotate工具對於防止因龐大的日誌文件而耗盡存儲空間是十分有用的。配置完畢後,進程是全自動的,能夠長時間在不須要人爲干預下運行。本教程重點關注幾個使用logrotate的幾個基本樣例,你也能夠定製它以知足你的需求。

相關文章
相關標籤/搜索