在維護Linux服務器時,常常須要查看系統中各類服務的日誌,以檢查服務器的運行狀態。 如登錄歷史、郵件、軟件安裝等日誌。系統管理員一個個去檢查會十分不方便;且大多時候,這會是一種被動的檢查,即只有在發現系統運行異常時纔會想到去查看日誌以獲取異常的信息。那麼如何主動、集中的分析這些日誌,併產生報告,定時發送給管理員就會顯得十分重要。html
logwatch 是一款用 Perl 語言編寫的開源日誌解析分析器。它能對原始的日誌文件進行解析並轉換成結構化格式的文檔,也能根據您的使用狀況和需求來定製報告。logwatch 的主要目的是生成更易於使用的日誌摘要,並非用來對日誌進行實時的處理和監控的。正由於如此,logwatch 一般被設定好時間和頻率的自動定時任務來調度運行或者是有須要日誌處理的時候從命令行裏手動運行。一旦日誌報告生成,logwatch 能夠經過電子郵件把這報告發送給您,您能夠把它保存成文件或者直接顯示在屏幕上。linux
Logwatch 報告的詳細程度和報告覆蓋範圍是徹底可定製化的。Logwatch 的日誌處理引擎也是可擴展的,從某種意義上來講,若是您想在一個新的應用程序中使用 logwatch 功能的話,只須要爲這個應用程序的日誌文件編寫一個日誌處理腳本(使用 Perl 語言),而後掛接到 logwatch 上就行。bash
logwatch 有一點很差的就是,在它生成的報告中沒有詳細的時間戳信息,而原來的日誌文件中是存在的。您只能知道被記錄下來的一段時間以內的特定事件,若是想要知道精確的時間點的信息,就不得不去查看原日誌文件了。服務器
不管在Debian系仍是Redhat繫上,安裝logwatch都很是簡單:dom
# apt-get install logwatch //Debian、Ubuntu.etc # yum install logwatch -y //Redhat、Centos.etc
如下內容基於 CentOS 6.x,其他系統相差不大。ssh
安裝後的目錄文件說明:
ide
/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
相似的目錄結構,能夠在這裏添加自定義的監控日誌信息。post
從上面的目錄結構劃分大概能夠了解到 logwatch 的原理:logwatch 首先要知道針對哪個服務, 從這個服務中獲得須要處理的 log 文件信息, 而後這個文件送給過濾腳本處理,以後把處理後格式化的信息展示出。內部細節請看第3篇參考。ui
在/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 報告的詳細程度。它能夠是個正整數,也能夠是分別表明着十、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
文件中。
另外在有的文章裏指定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推薦大多數人使用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"
咱們能夠看到在 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時間,詳見第一份參考)。
用一個簡單的例子介紹自定義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
參考