原文: http://www2.logwatch.org:81/tabs/docs/HOWTO-Customize-LogWatch.html (v1.7)
中譯: ping (2006/1/18 v1.6) (更新: 2006/3/1 v1.7)
目次:
這份文件描述這個 Logwatch 版本有哪些檔案、如何修改組態檔、和如何建立新的服務過濾器。
1. 簡介
Logwatch(日誌警戒)是個系統日誌的分析和報表程式,使用 Logwatch 的方式可以用
man logwatch
查到,在 man page 中的 "MORE INFORMATION" 一節列出了這個版本還有哪些文件檔可用。
在 man page 中說明的命令列選項可以用 '--help' 選項看到:
logwatch --help
這份文件剩下的部分是給想要客製或增強 Logwatch、以超越命令列選項所能提供的能力的人看的。
2. 目錄結構
這一節用預設的檔案名稱和位置說明 Logwatch 套件中的子目錄和檔案。
/usr/share/logwatch 目錄含有組態檔和(perl)執行檔,內容如下:
default.conf: Logwatch 的『出廠組態檔』。
dist.conf: 和您的作業系統相關的組態檔。
lib: 含有 perl 程式庫檔案的目錄。
scripts: 含有 perl 執行檔的目錄。
/etc/logwatch 目錄含有以下子目錄:
conf: 含有專為此系統而定的組態檔。
scripts: 含有專給此系統用的可執行手稿。
2.1. 組態結構
/usr/share/logwatch/default.conf、/usr/share/logwatch/dist.conf 和 /etc/logwatch/conf 等三個目錄都有相同的結構:
services: 這個子目錄含有各個服務用的組態檔, Logwatch 檢查本目錄的內容來決定有哪些服務可用。每個服務的組態檔的命名方式是服務名稱加上 ".conf" 字尾。
logfiles: 這個子目錄含有日誌群組的組態檔,每個日誌群組的組態檔含有相同格式的各個日誌的相關資訊,幾個服務可以使用同一個日誌群組的組態檔。組態檔的命名方式是群組名稱加上 ".conf" 字尾。不少群組名稱是從系統日誌的名稱來的(像 messages、maillog、secure 等等),但不全是這樣。
logwatch.conf: 這個檔案含有執行 Logwatch 所需的預設值,會影響到其所有的服務。許多參數都可以用命令列選項蓋過,請見 Logwatch man page。
ignore.conf: 這個檔案含有要忽略掉的日誌項目的正規表示式,當和 logwatch 的輸出比對時,會把符合的列(line)抑制掉,不論執行的是哪個服務。
/etc/logwatch/conf 目錄也可能會有個 'override.conf' 檔,請見第 4 節 "客製組態" 的說明。
2.2. 執行檔結構
/usr/share/logwatch/scripts 和 /etc/logwatch/scripts 兩個目錄有一樣的結構:
services: 這個子目錄含有各個服務的執行檔。除非另外在上述的服務組態檔中指定,不然執行檔一律是用 perl 語言寫的。
shared: 這個子目錄含有可能會被多個服務組態叫用的執行檔。
logfiles: 這個子目錄可能含有以日誌群組命名的子目錄,這種子目錄裡的執行檔在執行用到該日誌群組的服務時會自動被叫用。
3. 客製組態
Logwatch 可以、也已經用在許多不同的 Linux 和 UNIX 系統中,有些包含 Logwatch 的發行版本修改了預設的組態來順從系統的設定,因此大多數的人都不需要再去修改 Logwatch。
然而,自 Logwatch 7.0 版以來,有了更容易修改局部系統組態的機制。為什麼還會要改組態呢?可能是因為寫出日誌的服務改了組態、或者 Logwatch 使用者想要有不同的報表內容或報表形式。
您可以修改 /etc/logwatch/conf 目錄中的變數來客製 Logwatch 的輸出。
預設值都是在 /usr/share/logwatch/default.conf 檔中指定,您的發行版本還可能會在 /usr/share/logwatch/dist.conf 目錄中追加一些預設值,所有這些變數都是在這些目錄中的檔案裡宣告的,您可以修改預設值來改變 Logwatch 會用什麼方式顯示什麼內容。
客製變數的機制有二:
1. Logwatch 會先在 /etc/logwatch/conf 目錄搜尋和 /usr/share/logwatch/default.conf 目錄相同的名稱和相對位置的檔案,在這些檔案中宣告的變數會蓋過預設值。
舉例來說,如果 /etc/logwatch/conf/services/sendmail.conf 只有一行
$sendmail_unknownusersthreshold = 5
則未知用戶的閾值就從原預設的 1 設成 5,其他的參數則不受影響。
組態檔有四種不同的宣告,依每一行的第一個字元決定:
'#': 此行後面是註解,會被忽略。 '$': 第一欄是變數名。 '*': 表示一個執行檔名。
除了空白行以外,唯一的宣告形式是保留的變數名,如 LogFile、Archive 等等。
一般而言,設定了某個變數的值就會蓋掉之前設的值,不過以下的變數會累積:
logwatch.conf 中: LogFile、Service
services/service_name.conf 中: LogFile
logfiles/service_name.conf 中: LogFile、Archive
要清除某個變數在之前所做的設定的話,請把它設成空字串。累積性變數中重複的值會自動被刪除。
如果在 /etc/logwatch/conf 檔中宣告了某個執行手稿,在 /usr/share/logwatch/default.conf 或 /usr/share/logwatch/dist.conf 目錄中相對的檔中裡宣告的執行手稿全部不算。
由於變數和執行手稿宣告方式的關係,在 /etc/logwatch/conf/ 目錄中的檔案可以用以下兩種方式建立:
您可以建立一個如上所述的檔案,僅含有被修改的變數(和新執行手稿宣告,如果需要的話);或者
您可以從 /usr/share/logwatch/default.conf 目錄把整個組態檔拷貝到 /etc/logwatch/conf 目錄中的對應位置,然後修改需要變的行。因為累積性變數中的重複值會自動被刪除,而新執行手稿會蓋過舊的,這樣的結果應該是正確的。
2. 然後會搜尋 /etc/logwatch/conf/override.conf 檔;每一行的第一欄可以是以下之一:
#
這個字元表示本行剩下的部分是註解,會被忽略。
logwatch:
這個字串表示本行剩下的部分是全域的組態選項,語法則和 /usr/share/logwatch/default.conf/logwatch.conf 檔相同。
services/service_name:
(其中 service_name 是某個服務的名字。)這個字串表示本行剩下的部分是所指服務的組態選項,語法則和 /usr/share/logwatch/default.conf/services 檔相同。
logfiles/service_name:
(其中 service_name 是某個服務的名字。)這個字串表示本行剩下的部分是所指服務的組態選項,語法則和 /usr/share/logwatch/default.conf/logfiles 檔相同。
舉例來說:如果 /etc/logwatch/conf/override.conf 檔只有一行:
logwatch: Detail = High
那麼所有服務預設的細節水準就會設成『高』。
還有,在 override.conf 檔,以下的宣告:
logfiles/messages: LogFile = syslog
會使 Logwatch 在為某個服務分析預設的訊息檔之外,還會分析系統日誌檔。但以下兩個宣告的組合:
會讓 Logwatch 忽略預設的訊息檔,而只分析系統日誌檔。
4. 客製手稿
和第四節中客製組態的方式類似,您可以蓋過預設的執行手稿,只要把名字相同的執行檔放在 /etc/logwatch/scripts 目錄下、和 /usr/share/logwatch/scripts 下的執行檔相同的相對路徑的位置就可以了。只要 /etc/logwatch/scripts 目錄下有這樣的檔,/usr/share/logwatch/scripts 目錄下對應的檔就會被忽略。
5. 建立新的服務過濾器
要建立新的服務,只要依上面文字所說、在 /etc/logwatch 目錄下正確的地方建立新的組態檔和執行檔就可以了。這一節補充一些細節和範例,不過用 /usr/share/logwatch 目錄下現有的組態檔和執行手稿為起點來產生新檔案可能會容易一些。
5.1. Logfile 群組
logfile 群組組態檔中只有一行是必須的,就是 'LogFile' 命令。
-
# 這將是預設日誌目錄(大概是 /var/log)中叫做 'messages' 的日誌檔。 LogFile = messages # 您也可以給絕對路徑,像這樣: LogFile = /var/log/messages
LogFile 行您愛放幾行都可以,所有指定的檔會串接起來、再餵給所有用到這個日誌群組的過濾器。在指定檔名時也可以用標準的萬用字元。
另一個可有可無的命令是 'Archive'。您可以指定當用到 '--archives' 選項時要串接進來的檔案,這個檔案不存在沒關係。舉例來說:
-
# 這兩個 'Archive' 設定讓 Red Hat Linux 系統的用戶取出 'messages' 日誌的歸檔。 Archive = messages.? # 如果在 /etc/logrotate.conf 中打開了壓縮功能的話: Archive = messages.?.gz # 最好是兩行都用,這樣子 LogFile (日誌)群組在大多數的系統上都能正常工作。
一般而言,分析 LogFile 群組時應該要限定日期的範圍,如果日誌檔是標準的系統日誌檔格式,您可以用標準手稿 'ApplyStdDate' 來濾出適當的日誌條目。呼叫共享手稿(在 /usr/share/logwatch/scripts/shared 目錄下)的方式是:
-
*ApplyStdDate =
任何在等號之後的東西都會當作引數傳給程式(如果不需要引數的話,可以不寫等號)。您應該拿現有的 LogFile 群組組態檔當實例閱讀。
最後,如果 /usr/share/logwatch/scripts/logfiles/ 目錄存在的話,該目錄中的所有手稿都會執行。這些手稿從 STDIN 取得所有的日誌檔,並把修改過的日誌檔從 STDOUT 輸出。
5.2. 服務過濾器組態檔
您一旦定義了一個或多個日誌群組(或決定要用一個或多個已有的日誌群組),您需要定義您的服務過濾器。
這個檔案必須在 /etc/logwatch/conf/services/ 目錄,名字必須是 service_name.conf,其中 service_name 是服務的名字。您或許應該把別的服務現有的組態檔拷貝過來改。
只有一行是一定要的,就是 'LogFile' 命令。LogFile 命令讓您指定這個過濾器會處理的一個或多個 日誌群組(如上所述),請記住,任何過濾器可以處理任意多的日誌群組,而每個日誌群組都可以含有任意多的日誌檔和其歸檔的資料。
需要 /var/log/messages 中訊息的服務過濾器請加這一行:
-
LogFile = messages
註:這不是因為日誌檔的名字是 'messages',而是因為已定義的日誌群組的名字是 'messages'。
您可以有如下形式的命令:
-
*SharedScriptName = Arguments
這會執行 /usr/share/logwatch/scripts/shared/ 目錄下找到名為 SharedScriptName 的手稿,並傳送引數 'Arguments'。這個過濾器會修改該服務過濾器的輸入。
您也可以有如下形式的命令:
-
$EnvironmentVariable = Value
這個命令會設定環境變數 'EnvironmentVariable' 的值為 'Value',這個環境變數可以為您的過濾器所用。
您通常要為您的手稿指定一個標題(在 Logwatch 4.0 版加入的功能),如果指定了,Logwatch 會在您的服務的輸出前面加上開始符號、後面加上結束符號。這只會在有輸出時生效,如果您沒有產生輸出,就不會產生檔頭檔尾。定義標題的方式如下:
-
Title = "My Service Title"
5.3. 服務過濾器的執行檔
一旦上面所請的手續都做好了,您就可以開始寫您的過濾器了。您可以用任何程式語言寫,因為過濾器要做的事情是:
從標準輸入讀取日誌的條目
取用某些環境變數
生個報告送到標準輸出
在您嘗試寫過濾器之前,您應該先把下面的內容當成您的測試手稿,把它放到 /etc/logwatch/scripts/services/ 目錄,取名為 service_name(因為您把組態檔取名為 service_name.conf)。
-
###################### Cut Here ######################### #!/bin/bash # This is as nice script that will show you the lines you will # be processing and reporting on. It will first display the # standard environment variables and then it takes STDIN and # dump it right back out to STDOUT. # These are the standard environment variables. You can define # more in your service config file (see above). echo "Date Range: $LOGWATCH_DATE_RANGE" echo "Detail Level: $LOGWATCH_DETAIL_LEVEL" echo "Temp Dir: $LOGWATCH_TEMP_DIR" echo "Debug Level: $LOGWATCH_DEBUG" # Now take STDIN and dump it to STDOUT cat ###################### Cut Here #########################
如果您暫時性地把某個手稿(如 'pam')換成上面這個,您會注意到在 /var/log/messages 的訊息到達這個過濾器之前,很大一部分已經被切掉了。
環境變數 LOGWATCH_DETAIL_LEVEL 的值可以是任何整數;實際上,它通常是 0(低)、5(中)、或 10(高)。
您的手稿應該只產生合適的輸出,如果沒有相關的日誌條目,就不應該有輸出。同樣地,如果您要報告兩件事,如『Good Logins』和『Bad Logins』,您應該產生適當的標頭,比方說:
-
Bad Logins: amber (2 time(s)) kirk (3 time(s)) Good Logins: amber (5 time(s)) kirk (10 time(s))
然而,如果沒有發生失敗的登入,您應該只輸出:
-
Good Logins: amber (5 time(s)) kirk (10 time(s))
請注意看,因為沒有不良的登入,這裡就沒有 "Bad Logins:" 的標頭。您也應該使用細節環境變數來決定輸出什麼。不良登入恐怕總是要顯示出來,但是良好登入或許只有在較高的細節水準才要顯示。以下是您該如何使用細節設定的指南:
0 (低):只顯示錯誤和安全相關的問題
5 (中):顯示所有一般系統管理者會想知道的東西
10(高):顯示所有偏執狂系統管理者會想看的東西
在某些情況下,您可以用高於 10 的設定,這保留給連美國政府都沒興趣的瑣碎資訊。
6. 延伸閱讀
這份文件的簡介部分列出了一些資訊的出處,此外, http://www.logwatch.org 網站含有:
Logwatch 目前(和一些歸檔)的版本
取用通信論壇的方法,歡迎來信批評、建議、報蟲... 等等。
取用 CVS 庫的方法,可以獲得最新的程式碼。
如果您建立了新服務或加強了舊服務,而且覺得可能對其他人有用的話,請送信給 logwatch.org 的 logwatch-devel 通信論壇。
如果您寄補丁出來,請確定您有從 CVS 拿到的最新版,並且用統一格式(用 'cvs diff -u' 或 'diff -u' 產生)把補丁夾在信中當附件。
加強功能的建議,如果有實作的補丁的話,被接受的機會比較大。
7. 名詞翻譯彙編
- 日誌
log
- 日誌檔
log file
- 日誌群組
logfile group
- 條目
entry
- 歸檔
archive
- 服務
service
- 過濾器
filter
- 補丁
patch