天天看點

使用cron,logrotate來管理日志檔案

1) logrotate配置

   logrotate 程式是一個日志檔案管理工具。用來把舊的日志檔案删除,并建立新的日志檔案,我們把它叫做“轉儲”。

   我們可以根據日志檔案的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程式來執行。

   logrotate 程式還可以用于壓縮日志檔案,以及發送日志到指定的E-mail 。

   logrotate 的配置檔案是 /etc/logrotate.conf  主要參數如下表:

   參數                         功能

   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          在轉儲以前需要執行的指令可以放入這個對,這兩個關鍵字必須單獨成行

   postrotate/endscript         在轉儲以後需要執行的指令可以放入這個對,這兩個關鍵字必須單獨成行

   daily                        指定轉儲周期為每天

   weekly                       指定轉儲周期為每周

   monthly                      指定轉儲周期為每月

   rotate count                 指定日志檔案删除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份

   tabootext [+] list           讓logrotate 不轉儲指定擴充名的檔案,預設的擴充名是:.rpm-orig, .rpmsave, v, 和 ~ 

   size size                    當日志檔案到達指定的大小時才轉儲,Size 可以指定 bytes (預設)以及KB (sizek)或者MB (sizem).

2) 預設配置 logrotate

   logrotate 預設的配置檔案是 /etc/logrotate.conf

   Red Hat Linux 預設安裝的檔案内容是:

   # see "man logrotate" for details

   # rotate log files weekly

   weekly

   # keep 4 weeks worth of backlogs

   rotate 4

   # send errors to root

   errors root

   # create new (empty) log files after rotating old ones

   create

   # uncomment this if you want your log files compressed

   #compress

   1

   # RPM packages drop log rotation information into this directory

   include /etc/logrotate.d

   # no packages own lastlog or wtmp --we'll rotate them here

   /var/log/wtmp {

   monthly

   create 0664 root utmp

   rotate 1

   }

   /var/log/lastlog {

   # system-specific logs may be configured here

   預設的配置一般放在logrotate.conf 檔案的最開始處,影響整個系統。在本例中就是前面12行。

   第三行 weekly 指定所有的日志檔案每周轉儲一次。

   第五行 rotate 4 指定轉儲檔案的保留 4份。

   第七行 errors root 指定錯誤資訊發送給root。

   第九行 create 指定 logrotate 自動建立新的日志檔案,新的日志檔案具有和原來的檔案一樣的權限。

   第11行 #compress 指定不壓縮轉儲檔案,如果需要壓縮,去掉注釋就可以了。

3) 使用include 選項讀取其他配置檔案

   include 選項允許系統管理者把分散到幾個檔案的轉儲資訊,集中到一個主要的配置檔案。當 logrotate 從logrotate.conf 讀到include 選項時,會從指定檔案讀入配置資訊,就好像他們已經在/etc/logrotate.conf 中一樣。

   第13行 include /etc/logrotate.d 告訴 logrotate 讀入存放在/etc/logrotate.d 目錄中的日志轉儲參數,當系統中安裝了RPM 軟體包時,使用include 選項十分有用。RPM 軟體包的日志轉儲參數一般存放在/etc/logrotate.d 目錄。

   include 選項十分重要,一些應用把日志轉儲參數存放在 /etc/logrotate.d 。

   典型的應用有:apache, linuxconf, samba, cron 以及syslog。

   這樣,系統管理者隻要管理一個 /etc/logrotate.conf 檔案就可以了。

4) 使用include 選項覆寫預設配置

   當 /etc/logrotate.conf 讀入檔案時,include 指定的檔案中的轉儲參數将覆寫預設的參數,如下例:

   # linuxconf 的參數

   /var/log/htmlaccess.log

   {

   errors jim

   notifempty

   nocompress

   prerotate

     /usr/bin/chattr -a /var/log/htmlaccess.log

   endscript

   postrotate

     /usr/bin/chattr +a /var/log/htmlaccess.log

   /var/log/netconf.log

   在這個例子中,當 /etc/logrotate.d/linuxconf 檔案被讀入時,下面的參數将覆寫/etc/logrotate.conf中預設的參數。

   Notifempty

   errors jim

5) 為指定的檔案配置轉儲參數

   經常需要為指定檔案配置參數,一個常見的例子就是每月轉儲/var/log/wtmp。為特定檔案而使用的參數格式是:

   # 注釋

   /full/path/to/file

   {

   option(s)

   }

   下面的例子就是每月轉儲 /var/log/wtmp 一次:

   #Use logrotate to rotate wtmp

   /var/log/wtmp

6) 其他需要注意的問題

   a. 盡管花括号的開頭可以和其他文本放在同一行上,但是結尾的花括号必須單獨成行。

   b. 使用 prerotate 和 postrotate 選項

   下面的例子是典型的腳本 /etc/logrotate.d/syslog,這個腳本隻是對 /var/log/messages 有效。

   /var/log/messages

   { 

     /usr/bin/chattr -a /var/log/messages

     /usr/bin/kill -HUP syslogd

     /usr/bin/chattr +a /var/log/messages

   第一行指定腳本對 /var/log messages 有效

   prerotate 指令指定轉儲以前的動作

     /usr/bin/chattr -a 去掉/var/log/messages檔案的“隻追加”屬性 

   endscript 結束

   postrotate 指定轉儲後的動作

     /usr/bin/killall -HUP syslogd 用來重新初始化系統日志守護程式 syslogd

     /usr/bin/chattr +a /var/log/messages 重新為 /var/log/messages 檔案指定“隻追加”屬性,這樣防治程式員或使用者覆寫此檔案。

   最後的 endscript 用于結束 postrotate 部分的腳本

   c. logrotate 的運作分為三步:

   判斷系統的日志檔案,建立轉儲計劃以及參數,通過cron daemon 運作下面的代碼是 Red Hat Linux 預設的crontab 來每天運作logrotate。

   #/etc/cron.daily/logrotate

   #! /bin/sh

   /usr/sbin/logrotate /etc/logrotate.conf

   d. /var/log/messages 不能産生的原因:

   這種情況很少見,但是如果你把/etc/services 中的 514/UDP 端口關掉的話,這個檔案就不能産生了。

7) cron

   cron 是一個可以用來根據時間、日期、月份、星期的組合來排程對重複任務的執行的守護程序。

   cron 假定系統持續運作。如果當某任務被排程時系統不在運作,該任務就不會被執行。 

   要使用 cron 服務,你必須安裝了 vixie-cron RPM 軟體包,而且必須在運作 crond 服務。要判定該軟體包是否已安裝,使用 rpm -q vixie-cron 指令。要判定該服務是否在運作,使用 /sbin/service crond status 指令。

   a. 配置 cron 任務

   cron 的主配置檔案是 /etc/crontab,它包括下面幾行:

   SHELL=/bin/bash

   PATH=/sbin:/bin:/usr/sbin:/usr/bin

   MAILTO=root

   HOME=/

   # run-parts

   01 * * * * root run-parts /etc/cron.hourly

   02 4 * * * root run-parts /etc/cron.daily

   22 4 * * 0 root run-parts /etc/cron.weekly

   42 4 1 * * root run-parts /etc/cron.monthly 

   前四行是用來配置 cron 任務運作環境的變量。SHELL 變量的值告訴系統要使用哪個 shell 環境(在這個例子裡是 bash shell);PATH 變量定義用來執行指令的路徑。cron 任務的輸出被郵寄給 MAILTO 變量定義的使用者名。如果 MAILTO 變量被定義為空白字元串(MAILTO=""),電子郵件就不會被寄出。HOME 變量可以用來設定在執行指令或腳本時使用的主目錄。

   /etc/crontab 檔案中的每一行都代表一項任務,它的格式是: 

   minute   hour   day   month   dayofweek   command

   minute — 分鐘,從 0 到 59 之間的任何整數

   hour — 小時,從 0 到 23 之間的任何整數

   day — 日期,從 1 到 31 之間的任何整數(如果指定了月份,必須是該月份的有效日期)

   month — 月份,從 1 到 12 之間的任何整數(或使用月份的英文簡寫如 jan、feb 等等)

   dayofweek — 星期,從 0 到 7 之間的任何整數,這裡的 0 或 7 代表星期日(或使用星期的英文簡寫如 sun、mon 等等)

   command — 要執行的指令(指令可以是 ls /proc >> /tmp/proc 之類的指令,也可以是執行你自行編寫的腳本的指令。)

   在以上任何值中,星号(*)可以用來代表所有有效的值。譬如,月份值中的星号意味着在滿足其它制約條件後每月都執行該指令。 

   整數間的短線(-)指定一個整數範圍。譬如,1-4 意味着整數 1、2、3、4。 

   用逗号(,)隔開的一系列值指定一個清單。譬如,3, 4, 6, 8 标明這四個指定的整數。 

   正斜線(/)可以用來指定間隔頻率。在範圍後加上 /<integer> 意味着在範圍内可以跳過 integer。譬如,0-59/2 可以用來在分鐘字段定義每兩分鐘。間隔頻率值還可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三個月運作一次任務。 

   開頭為井号(#)的行是注釋,不會被處理。

   如你在 /etc/crontab 檔案中所見,它使用 run-parts 腳本來執行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目錄中的腳本,這些腳本被相應地每小時、每日、每周、或每月執行。這些目錄中的檔案應該是 shell 腳本。

   如果某 cron 任務需要根據排程來執行,而不是每小時、每日、每周、或每月地執行,它可以被添加到 /etc/cron.d 目錄中。該目錄中的所有檔案使用和 /etc/crontab 中一樣的文法。範例請參見下例。

   # record the memory usage of the system every monday 

   # at 3:30AM in the file /tmp/meminfo

   30 3 * * mon cat /proc/meminfo >> /tmp/meminfo

   # run custom script the first day of every month at 4:10AM

   10 4 1 * * /root/scripts/backup.sh 

   根使用者以外的使用者可以使用 crontab 工具來配置 cron 任務。所有使用者定義的 crontab 都被儲存在 /var/spool/cron 目錄中,并使用建立它們的使用者身份來執行。要以某使用者身份建立一個 crontab 項目,登入為該使用者,然後鍵入 crontab -e 指令,使用由 VISUAL 或 EDITOR 環境變量指定的編輯器來編輯該使用者的 crontab。該檔案使用的格式和 /etc/crontab 相同。當對 crontab 所做的改變被儲存後,該 crontab 檔案就會根據該使用者名被儲存,并寫入檔案 /var/spool/cron/username 中。

   cron 守護程序每分鐘都檢查 /etc/crontab 檔案、etc/cron.d/ 目錄、以及 /var/spool/cron 目錄中的改變。如果發現了改變,它們就會被載入記憶體。這樣,當某個 crontab 檔案改變後就不必重新啟動守護程序了。

   b. 控制對 cron 的使用

   /etc/cron.allow 和 /etc/cron.deny 檔案被用來限制對 cron 的使用。這兩個使用控制檔案的格式都是每行一個使用者。兩個檔案都不允許空格。如果使用控制檔案被修改了,cron 守護程序(crond)不必被重新開機。使用控制檔案在每次使用者添加或删除一項 cron 任務時都會被讀取。

   無論使用控制檔案中的規定如何,根使用者都總是可以使用 cron。 

   如果 cron.allow 檔案存在,隻有其中列出的使用者才被允許使用 cron,并且 cron.deny 檔案會被忽略。 

   如果 cron.allow 檔案不存在,所有在 cron.deny 中列出的使用者都被禁止使用 cron。

繼續閱讀