茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671610 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_DPP_0012.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2012/1/30 8:43:22
logrotate 的設定檔

既然 logrotate 主要是針對登錄檔來進行輪替的動作,所以囉,他當然必須要記載『 在什麼狀態下才將登錄檔進行輪替』的設定啊!那麼 logrotate 這個程式的參數設定檔在哪裡呢?呵呵!那就是:
/etc/logrotate.conf
/etc/logrotate.d/
那個 logrotate.conf 才是主要的參數檔案,至於 logrotate.d 是一個目錄, 該目錄裡面的所有檔案都會被主動的讀入 /etc/logrotate.conf 當中來進行!另外,在 /etc/logrotate.d/ 裡面的檔案中,如果沒有規定到的一些細部設定,則以 /etc/logrotate.conf 這個檔案的規定來指定為預設值!

由上面的圖示我們可以清楚的知道,當第一次執行完 rotate 之後,原本的 messages 會變成 messages.1 而且會製造一個空的 messages 給系統來儲存登錄檔。而第二次執行之後,則 messages.1 會變成 messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存登錄檔!那麼如果我們僅設定保留三個登錄檔而已的話,那麼執行第四次時,則 messages.3 這個檔案就會被刪除,並由後面的較新的保存登錄檔所取代!基本的工作就是這樣啦!

那麼多久進行一次這樣的 logrotate 工作呢?這些都記錄在 logrotate.conf 裡面,我們來看一下預設的 logrotate 的內容吧!
[root@www ~]# vim /etc/logrotate.conf

# 底下的設定是 "logrotate 的預設設定值" ,如果個別的檔案設定了其他的參數,
# 則將以個別的檔案設定為主,若該檔案沒有設定到的參數則以這個檔案的內容為預設值!

weekly    <==預設每個禮拜對登錄檔進行一次 rotate 的工作
rotate 4  <==保留幾個登錄檔呢?預設是保留四個!
create    <==由於登錄檔被更名,因此建立一個新的來繼續儲存之意!
#compress <==被更動的登錄檔是否需要壓縮?如果登錄檔太大則可考慮此參數啟動

include /etc/logrotate.d
# 將 /etc/logrotate.d/ 這個目錄中的所有檔案都讀進來執行 rotate 的工作!

/var/log/wtmp {       <==僅針對 /var/log/wtmp 所設定的參數
    monthly           <==每個月一次,取代每週!
    minsize 1M        <==檔案容量一定要超過 1M 後才進行 rotate (略過時間參數)
    create 0664 root utmp <==指定新建檔案的權限與所屬帳號/群組
    rotate 1          <==僅保留一個,亦即僅有 wtmp.1 保留而已。
}
# 這個 wtmp 可記錄登入者與系統重新開機時的時間與來源主機及登入期間的時間。
# 由於具有 minsize 的參數,因此不見得每個月一定會進行一次喔!要看檔案容量。
# 由於僅保留一個登錄檔而已,不滿意的話可以將他改成 rotate 5 吧!

由這個檔案的設定我們可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄,所以,其實我們可以將所有的資料都給他寫入 /etc/logrotate.conf 即可,但是這樣一來這個檔案就實在是太複雜了,尤其是當我們使用很多的服務在系統上面時, 每個服務都要去修改 /etc/logrotate.conf 的設定也似乎不太合理~ 所以,如果獨立出來一個目錄,那麼每個以 RPM 打包方式所建立的服務的登錄檔輪替設定, 就可以獨自成為一個檔案,並且放置到 /etc/logrotate.d/ 當中即可,真是方便又合理的做法啊! ^_^

一般來說,這個 /etc/logrotate.conf 是『預設的輪替狀態』而已, 我們的各個服務都可以擁有自己的登錄檔輪替設定,你也可以自行修改成自己喜歡的樣式啊! 例如,如果你的系統的空間夠大,並且擔心除錯以及駭客的問題,那麼可以:

將 rotate 4 改成 rotate 9 左右,以保存較多的備份檔案;
大部分的登錄檔不需要 compress 囉!但是空間太小就需要 compress !尤其是很佔硬碟空間的 httpd 更需要 compress 的!
好了,上面我們大致介紹了 /var/log/wtmp 這個檔案的設定,現在你知道了 logrotate.conf 的設定語法是:

登錄檔的絕對路徑檔名 ... {
個別的參數設定值,如 monthly, compress 等等
}

底下我們再以 /etc/logrotate.d/syslog 這個輪替 syslog 服務的檔案,來看看該如何設定他的 rotate 呢?
[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \
/var/log/boot.log /var/log/cron {
  sharedscripts
  postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
  endscript
}


在上面的語法當中,我們知道正確的 logrotate 的寫法為:

檔名:被處理的登錄檔絕對路徑檔名寫在前面,可以使用空白字元分隔多個登錄檔;
參數:上述檔名進行輪替的參數使用 { } 包括起來;
執行腳本:可呼叫外部指令來進行額外的命令下達,這個設定需與 sharedscripts .... endscript 設定合用才行。至於可用的環境為:

prerotate:在啟動 logrotate 之前進行的指令,例如修改登錄檔的屬性等動作;
postrotate:在做完 logrotate 之後啟動的指令,例如重新啟動 (kill -HUP) 某個服務!
Prerotate 與 postrotate 對於已加上特殊屬性的檔案處理上面,是相當重要的執行程序!
那麼 /etc/logrotate.d/syslog 內設定的六個檔案的輪替功能就變成了:

該設定只對 /var/log/ 內的 messages, secure, maillog, spooler, boot.log, cron 有效;
登錄檔輪替每週一次、保留四個、且輪替下來的登錄檔不進行壓縮(未更改預設值);
輪替完畢後 (postrotate) 取得 syslog 的 PID 後,以 kill -HUP 重新啟動 syslogd
假設我們有針對 /var/log/messages 這個檔案增加 chattr +a 的屬性時, 依據 logrotate 的工作原理,我們知道,這個 /var/log/messages 將會被更名成為 /var/log/messages.1 才是。但是由於加上這個 +a 的參數啊,所以更名是不可能成功的! 那怎麼辦呢?呵呵!就利用 prerotate 與 postrotate 來進行登錄檔輪替前、後所需要作的動作啊! 果真如此時,那麼你可以這樣修改一下這個檔案喔!
[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \
/var/log/boot.log /var/log/cron {
  sharedscripts
  prerotate
    /usr/bin/chattr -a /var/log/messages
  endscript
  sharedscripts
  postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    /usr/bin/chattr +a /var/log/messages
  endscript
}


看到否?就是先給他去掉 a 這個屬性,讓登錄檔 /var/log/messages 可以進行輪替的動作, 然後執行了輪替之後,再給他加入這個屬性!請特別留意的是,那個 /bin/kill -HUP ... 的意義,這一行的目的在於將系統的 syslogd 重新以其參數檔 (syslog.conf) 的資料讀入一次!也可以想成是 reload 的意思啦! 由於我們建立了一個新的空的紀錄檔,如果不執行此一行來重新啟動服務的話, 那麼記錄的時候將會發生錯誤呦!(請回到第十七章讀一下 kill 後面的 signal 的內容說明)

實際測試 logrotate 的動作

好了,設定完成之後,我們來測試看看這樣的設定是否可行呢?給他執行底下的指令:
[root@www ~]# logrotate [-vf] logfile

選項與參數:
-v :啟動顯示模式,會顯示 logrotate 運作的過程喔!
-f :不論是否符合設定檔的資料,強制每個登錄檔都進行 rotate 的動作!

範例一:執行一次 logrotate 看看整個流程為何?
[root@www ~]# logrotate -v /etc/logrotate.conf
reading config file /etc/logrotate.conf <==讀取主要設定檔
including /etc/logrotate.d              <==呼叫外部的設定
reading config file acpid               <==就是外部設定啊!
....(中間省略)....
Handling 21 logs                        <==共有 21 個登錄檔被記錄
....(中間省略)....
rotating pattern: /var/log/messages /var/log/secure /var/log/maillog \
/var/log/spooler /var/log/boot.log /var/log/cron  weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/messages       <==開始處理 messages
  log does not need rotating            <==因為時間未到,不需要更動!
....(底下省略)....

範例二:強制進行 logrotate 的動作
[root@www ~]# logrotate -vf /etc/logrotate.conf
....(前面省略)....
rotating log /var/log/messages, log->rotateCount is 4
renaming /var/log/messages.4 to /var/log/messages.5 (rotatecount 4, logstart 1, i 4),
renaming /var/log/messages.3 to /var/log/messages.4 (rotatecount 4, logstart 1, i 3),
renaming /var/log/messages.2 to /var/log/messages.3 (rotatecount 4, logstart 1, i 2),
renaming /var/log/messages.1 to /var/log/messages.2 (rotatecount 4, logstart 1, i 1),
renaming /var/log/messages.0 to /var/log/messages.1 (rotatecount 4, logstart 1, i 0),
old log /var/log/messages.0 does not exist
....(底下省略)....
# 看到否?整個 rotate 的動作就是這樣一步一步進行的~

[root@www ~]# ll /var/log/messages*; lsattr /var/log/messages
-rw------- 1 root root    63 Apr  8 15:19 /var/log/messages
-rw------- 1 root root   670 Apr  8 14:22 /var/log/messages.1
-rw------- 1 root root 24984 Apr  1 19:26 /var/log/messages.2
-rw------- 1 root root  1911 Mar 28 11:32 /var/log/messages.3
-rw------- 1 root root 25193 Mar 22 04:02 /var/log/messages.4
-----a------- /var/log/messages <==主動加入 a 的隱藏屬性囉!

上面那個 -f 具有『強制執行』的意思,如果一切的設定都沒有問題的話,那麼理論上,你的 /var/log 這個目錄就會起變化囉!而且應該不會出現錯誤訊息才對!嘿嘿!這樣就 OK 了!很棒不是嗎?!

由於 logrotate 的工作已經加入 crontab 裡頭了!所以現在每天系統都會自動的給他查看 logrotate 囉!不用擔心的啦!只是要注意一下那個 /var/log/messages 裡頭是否常常有類似底下的字眼:

Apr 8 15:19:47 www syslogd 1.4.1: restart (remote reception).
這說明的是 syslogd 重新啟動的時間啦 (就是因為 /etc/logrotate.d/syslog 的設定之緣故!) 底下我們來進行一些例題的練習,讓你更詳細的瞭解 logrotate 的功用啊!

自訂登錄檔的輪替功能

假設前提是這樣的,前一小節當中,假設你已經建立了 /var/log/admin.log 這個檔案, 現在,你想要將該檔案加上 +a 這個隱藏標籤,而且設定底下的相關資訊:

登錄檔輪替一個月進行一次;
該登錄檔若大於 10MB 時,則主動進行輪替,不需要考慮一個月的期限;
保存五個備份檔案;
備份檔案需要壓縮
那你可以怎麼樣設定呢?呵呵~很簡單啊!看看底下的動作吧!

# 1. 先建立 +a 這個屬性啊!
[root@www ~]# chattr +a /var/log/admin.log
[root@www ~]# lsattr /var/log/admin.log
-----a------- /var/log/admin.log
[root@www ~]# mv /var/log/admin.log /var/log/admin.log.1
mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1':
Operation not permitted
# 這裡確定了加入 a 的隱藏屬性!所以 root 無法移動此登錄檔!

# 2. 開始建立 logrotate 的設定檔,增加一個檔案在 /etc/logrotate.d 內就對了!
[root@www ~]# vi /etc/logrotate.d/admin
# This configuration is from VBird 2009/04/08
/var/log/admin.log {
        monthly   <==每個月進行一次
        size=10M  <==檔案容量大於 10M 則開始處置
        rotate 5  <==保留五個!
        compress  <==進行壓縮工作!
        sharedscripts
        prerotate
                /usr/bin/chattr -a /var/log/admin.log
        endscript
        sharedscripts
        postrotate
                /usr/bin/killall -HUP syslogd
                /usr/bin/chattr +a /var/log/admin.log
        endscript
}

# 3. 測試一下 logrotate 相關功能的資訊顯示:
[root@www ~]# logrotate -v /etc/logrotate.conf
....(前面省略)....
rotating pattern: /var/log/admin.log  10485760 bytes (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.log
  log does not need rotating
not running prerotate script, since no logs will be rotated
not running postrotate script, since no logs were rotated
....(底下省略)....
# 因為還不足一個月,檔案也沒有大於 10M,所以不需進行輪替!

# 4. 測試一下強制 logrotate 與相關功能的資訊顯示:
[root@www ~]# logrotate -vf /etc/logrotate.d/admin
reading config file /etc/logrotate.d/admin
reading config info for /var/log/admin.log

Handling 1 logs

rotating pattern: /var/log/admin.log  forced from command line (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.log
  log needs rotating
rotating log /var/log/admin.log, log->rotateCount is 5
renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5),
old log /var/log/admin.log.5.gz does not exist
renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4),
old log /var/log/admin.log.4.gz does not exist
renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3),
old log /var/log/admin.log.3.gz does not exist
renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2),
old log /var/log/admin.log.2.gz does not exist
renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1),
old log /var/log/admin.log.1.gz does not exist
renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0),
old log /var/log/admin.log.0.gz does not exist
log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it
running prerotate script
renaming /var/log/admin.log to /var/log/admin.log.1
running postrotate script
compressing log with: /bin/gzip


[root@www ~]# lsattr /var/log/admin.log*
-----a------- /var/log/admin.log
------------- /var/log/admin.log.1.gz  <==有壓縮過喔!

看到了嗎?透過這個方式,我們可以建立起屬於自己的 logrotate 設定檔案, 很簡便吧!尤其是要注意的, /etc/syslog.conf 與 /etc/logrotate.d/* 檔案常常要搭配起來,例如剛剛我們提到的兩個案例中所建立的 /var/log/admin.log 就是一個很好的例子~建立後,還要使用 logrotate 來輪替啊! ^_^


原文出處:鳥哥的 Linux 私房菜 -- 登錄檔的分析啦!
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|