开源 linux nginx Firefox 程序员 Windows 云计算 centos Python wordpress 编程 Ubuntu java shell google php mysql apache 微软 Android

在Linux上使用logwatch分析監控日誌文件

1. 介紹

在維護Linux服務器時,經常需要查看系統中各種服務的日誌,以檢查服務器的運行狀態。 如登陸歷史、郵件、軟件安裝等日誌。系統管理員一個個去檢查會十分不方便;且大多時候,這會是一種被動的檢查,即只有在發現系統運行異常時才會想到去查看日誌以獲取異常的信息。那麽如何主動、集中的分析這些日誌,並產生報告,定時發送給管理員就會顯得十分重要。

logwatch 是一款用 perl 語言編寫的開源日誌解析分析器。它能對原始的日誌文件進行解析並轉換成結構化格式的文檔,也能根據您的使用情況和需求來定制報告。logwatch 的主要目的是生成更易於使用的日誌摘要,並不是用來對日誌進行實時的處理和監控的。正因為如此,logwatch 通常被設定好時間和頻率的自動定時任務來調度運行或者是有需要日誌處理的時候從命令行裏手動運行。一旦日誌報告生成,logwatch 可以通過電子郵件把這報告發送給您,您可以把它保存成文件或者直接顯示在屏幕上。

Logwatch 報告的詳細程度和報告覆蓋範圍是完全可定制化的。Logwatch 的日誌處理引擎也是可擴展的,從某種意義上來說,如果您想在一個新的應用程序中使用 logwatch 功能的話,只需要為這個應用程序的日誌文件編寫一個日誌處理腳本(使用 Perl 語言),然後掛接到 logwatch 上就行。

logwatch 有一點不好的就是,在它生成的報告中沒有詳細的時間戳信息,而原來的日誌文件中是存在的。您只能知道被記錄下來的一段時間之內的特定事件,如果想要知道精確的時間點的信息,就不得不去查看原日誌文件了。

2. 安裝與配置說明

2.1 安裝

無論在Debian系還是Redhat系上,安裝logwatch都非常簡單:

# apt-get install logwatch     //Debian、Ubuntu.etc
# yum install logwatch -y       //Redhat、CentOS.etc
以下內容基於 CentOS 6.x,其余系統相差不大。

2.2 配置

2.2.1 配置文件說明

安裝後的目錄文件說明:


logwatch-dir-structure.jpg&objectId=1190

/usr/share/logwatch
    default.conf/     # 配置目錄
        logwatch.conf   # 主配置文件,收件人,級別等
        logfiles/       # 定義待分析服務的日誌文件組路徑,相對於/var/log(*.conf)
        services/       # 自定義需分析日誌的service目錄(*.conf)
    scripts/          # 可執行腳本
        logwatch.pl     # 啟動分析的perl腳本,/usr/sbin/logwatch的源鏈接
        logfiles/       # 可包含多個logwatch日誌文件組的子目錄,對應的日誌服務運行的時候,子目錄下的腳本會自動被調用
        services/       # logwatch日誌服務的過濾腳本,一一對應
        shared/         # 可被多個logwatch日誌服務引用的腳本
    dist.conf/
        logfiles/
        services/
    lib/
默認情況下使用的是/usr/share/logwatch/default.conf/logwatch.conf作為主配置文件,但在/etc/logwatch/conf/logwatch.conf中的存在配置選項會覆蓋前一個(/usr/share/logwatch下的logwatch.conf還是會起作用,比如在/etc/logwatch的logwatch.conf中沒有的選項)。但優先級最高的是在執行命令行中指定的選項。

在/etc/logwatch下也存在一個與/usr/share/logwatch類似的目錄結構,可以在這裏添加自定義的監控日誌信息。

從上面的目錄結構劃分大概可以了解到 logwatch 的原理:logwatch 首先要知道針對哪一個服務, 從這個服務中得到需要處理的 log 文件信息, 然後這個文件送給過濾腳本處理,之後把處理後格式化的信息展現出。內部細節請看第3篇參考。

2.2.2 編輯配置

在/usr/share/doc/logwatch-7.3.6/HOWTO-Customize-LogWatch文件中有這裏的詳細的配置說明。

個人還是習慣在/etc/logwatch/下管理配置文件,但又不太希望同時兩個配置文件生效,所以對/usr/share/logwatch/default.conf/logwatch.conf備份,然後軟鏈接/etc/logwatch/conf/logwatch.conf:

ln -s /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
試著執行logwatch --service sshd --print感受一下處理的結果。接下來修改/etc/logwatch/conf/logwatch.conf文件的默認配置來做些個性化設置。

修改日誌分析級別

Detail = <Low, Med, High, or a number>
“Detail” 配置指令控制著 logwatch 報告的詳細程度。它可以是個正整數,也可以是分別代表著10、5和0數字的 High、Med、Low 幾個選項。這裏設置成High。(配置文件中是不區分大小寫的)

指定報告收件人

MailTo = youremailaddress@yourdomain.com

MailFrom = youremailaddress@yourdomain.com
MailTo指定logwatch日誌報告接收人,要把一份報告發送給多個用戶,只需要把他們的郵件地址用空格或逗號隔開,但是logwatch認為你已經配置好本地郵件服務器(sendmail或postfix),並能正確傳遞給用戶郵箱。

MailFrom,顧名思義,指定發件人。郵件地址可以說完整的收件人地址,也可以是服務器上的本地用戶如root(有的郵件服務器不支持顯示發件人別名)。

指定發送郵件的客戶端

mailer = "sendmail -t"
默認采用的是sendmail(不是sendmail服務器),而且一般沒什麽問題。在我的環境下有點特殊,郵件服務器必須通過smtp認證才能發送郵件,不支持匿名和其他本地MTA投遞的郵件,而sendmail我一直沒有找到設置smtp用戶和密碼認證的地方(知道的煩請告知),所以就改用了mailer = "mailx -t",然後在/etc/mail.rc中設置from、smtp、smtp-auth-user、smtp-auth-password、smtp-auth參數,但使用mailx帶來的問題是後面設置郵件報告格式為html時,無法設置header信息從而foxmail不能解析html正文。嘗試了 sendEmail 也沒很好的解決。

大部分人情況可能沒這麽復雜,其實就是一個發件客戶端的功能,網上得知有 mutt 結合 msmtp 可以解決該問題:

# yum install -y mutt       //mutt其實可以不安裝
# tar jxvf msmtp-1.4.16.tar.bz2 && cd msmtp-1.4.16
# ./configure && make && make install

# vi ~/.msmtprc 
  account default
  host your.smtp-server.com
  from username@smtp-server.com
  auth login
  user username
  password your_auth_pwd
  logfile ~/msmtp.log

# 如果使用mutt發送,還需要設置~/.muttrc
將 mailer 改成mailer = "msmtp -t"。

輸出格式

Output = <mail, html or unformatted>
默認不指定輸出格式(plain text),系統管理員通過郵件客戶端(如foxmail)看到的郵件內容是文本形式,比較簡單、節省帶寬;可以指定為html,此時看到的是可點擊鏈接的友好的頁面。

當同時設定了Save = /tmp/logwatch時,便不會發送郵件報告了,將會根據Output指定的格式保存到一個Save文件中。

logwatch-html-mail.png&objectId=11900000

另外在有的文章裏指定Format選項,經過本人試驗在7.3.6版本中無效。

收集日誌的範圍

Range = <Yesterday|Today|All>
Range配置指令定義了生成 logwatch 報告的時間段信息。這個指令通常可選的值是 Yesterday、Today、All。當作用了Rang = All時,Archive = yes 這個指令項也必須配置上,那麽所有的已存檔的日誌文件 (比如,/var/log/maillog、/var/log/maillog-20150111)都會被處理到。

如果我們是通過 crontab 每天收集的話,可以只報告昨天或今天的日誌情況。

收集哪些服務的日誌

Service = <service-name-1>
Service = <service-name-2>
. . .
Service選項指定想要監控的一個或多個服務。在/usr/share/logwatch/scripts/services目錄下列出的服務都能被監控,它們已經涵蓋了重要的系統服務(例如:pam,secure,iptables,syslogd 等),也涵蓋了一些像 sudo、sshd、http、fail2ban、samba等主流的應用服務。如果您想添加新的服務到列表中,得編寫一個相應的日誌處理 Perl 腳本,並把它放在這個目錄中。

logwatch-script-service.png&objectId=119

對於一個綜合日誌分析工具,logwatch推薦大多數人使用Service = "All",然後通過繼續添加Service = "-service_name"等來去掉那些不監控的日誌。當然在服務器上,並不是所有script下的服務都有啟動,有些並沒有日誌。

命令行指定logwatch選項

如果您不想個性化 /etc/logwatch/conf/logwatch.conf,您可以不修改此文件讓其默認,然後在命令行裏運行如下所示的命令:

# logwatch --detail 10 --mailto youremailaddress@yourdomain.com --range today \
>  --service sshd --service postfix --service zz-disk_space --service -zz-network \
> --output mail 
logwatch.conf完整示例

LogDir = /var/log
TmpDir = /var/cache/logwatch
Print = No

Range = yesterday
Detail = High

MailTo = zhouxiao@example.com
MailFrom = itsection@example.com
mailer = "msmtp -t"
Output = html

Service = All
Service = "-zz-network" 
Service = "-zz-sys"
Service = "-eximstats" 

3. 擴展

3.1 cron daily

我們可以看到在 crontab 定時任務設定目錄下存在/etc/cron.daily/0logwatch:

#!/bin/bash

DailyReport=`grep -e "^[[:space:]]*DailyReport[[:space:]]*=[[:space:]]*" /usr/share/logwatch/default.conf/logwatch.conf | head -n1 | sed -e "s|^\s*DailyReport\s*=\s*||"`

if [ "$DailyReport" != "No" ] && [ "$DailyReport" != "no" ]
then
    logwatch
fi
如果在logwatch.conf中顯式設置了選項DailyReport = No,則會取消logwatch每日執行任務。如果你要修改cron.daily的執行時間,可以刪掉這個0logwatch然後添加到/etc/crontab裏,或者修改/etc/anacrontab的START_HOURS_RANGE。

所以 logwatch 的工作不是監控日誌異常後及時報警的工具,因為默認它是每天一封整合的郵件,並不具有及時性(安裝perl的CPAN模塊後可以更精確的控制logwatch時間,詳見第一份參考)。

3.2 定制自己要監控的日誌

用一個簡單的例子介紹自定義logwatch的配置方法。

首先創建logwatch日誌文件組
/etc/logwatch/conf/logfiles/test.conf:

LogFile = /path/to/your/logfile
LogFile = /path/to/your/second/logfile
然後創建logwatch服務配置文件
/etc/logwatch/conf/services/test.conf:

Title = test title     # 日誌文件裏的標題
LogFile = test   # logwatch日誌文件組的名字,通常是對應的配置文件的文件名部分
創建logwatch服務過濾器腳本
/etc/logwatch/scripts/services/test:

#!/bin/bash

grep -i ERROR
上面的腳本會從日誌文件裏過濾出包含ERROR的行。最後,為新建的腳本添加執行權限:

chmod +x /etc/logwatch/scripts/services/test

延伸阅读

评论