基礎學習篇 - CentOS 7.x

第十八章、認識與分析登錄檔

很多時候大家都需要分析登錄檔!尤其是系統不穩定的時候!透過分析登錄檔,你會更瞭解系統的!

最近更新時間: 2015/08/20

當你的 Linux 系統出現不明原因的問題時,很多人都告訴你,你要查閱一下登錄檔才能夠知道系統出了什麼問題了,所以說, 了解登錄檔是很重要的事情呢。登錄檔可以記錄系統在什麼時間、哪個主機、哪個服務、出現了什麼訊息等資訊, 這些資訊也包括使用者識別資料、系統故障排除須知等資訊。如果你能夠善用這些登錄檔資訊的話,你的系統出現錯誤時, 你將可以在第一時間發現,而且也能夠從中找到解決的方案,而不是昏頭轉向的亂問人呢。 此外,登錄檔所記錄的資訊量是非常大的,要人眼分析實在很困難。此時利用 shell script 或者是其他軟體提供的分析工具來處理複雜的登錄檔,可以幫助你很多很多喔!

18.1 什麼是登錄檔

詳細而確實的分析以及備份系統的登錄檔』是一個系統管理員應該要進行的任務之一。 那麼什麼是登錄檔呢?簡單的說,就是記錄系統活動資訊的幾個檔案, 例如:何時、何地 (來源 IP)、何人 (什麼服務名稱)、做了什麼動作 (訊息登錄囉)。 換句話說就是:記錄系統在什麼時候由哪個程序做了什麼樣的行為時,發生了何種的事件等等

18.1.1 CentOS 7 登錄檔簡易說明

要知道的是,我們的 Linux 主機在背景之下有相當多的 daemons 同時在工作著,這些工作中的程序總是會顯示一些訊息, 這些顯示的訊息最終會被記載到登錄檔當中啦。也就是說,記錄這些系統的重要訊息就是登錄檔的工作啦!

  • 登錄檔的重要性

為什麼說登錄檔很重要,重要到系統管理員需要隨時注意他呢?我們可以這麼說:

  • 解決系統方面的錯誤:

用 Linux 這麼久了,你應該偶而會發現系統可能會出現一些錯誤,包括硬體捉不到或者是某些系統服務無法順利運作的情況。 此時你該如何是好?由於系統會將硬體偵測過程記錄在登錄檔內,你只要透過查詢登錄檔就能夠瞭解系統作了啥事! 並且由第十六章我們也知道 SELinux 與登錄檔的關係更加的強烈!所以囉,查詢登錄檔可以克服一些系統問題啦!

  • 解決網路服務的問題:

你可能在做完了某些網路服務的設定後,卻一直無法順利啟動該服務,此時該怎辦?去廟裡面拜拜抽籤嗎? 三太子大大可能無法告訴你要怎麼處理呢!由於網路服務的各種問題通常都會被寫入特別的登錄檔, 其實你只要查詢登錄檔就會知道出了什麼差錯,還不需要請示三太子大大啦!舉例來說,如果你無法啟動郵件伺服器 (postfix), 那麼查詢一下 /var/log/maillog 通常可以得到不錯的解答!

  • 過往事件記錄簿:

這個東西相當的重要!例如:你發現 WWW 服務 (httpd 軟體) 在某個時刻流量特別大,你想要瞭解為什麼時, 可以透過登錄檔去找出該時段是哪些 IP 在連線與查詢的網頁資料為何,就能夠知道原因。 此外,萬一哪天你的系統被入侵,並且被利用來攻擊他人的主機,由於被攻擊主機會記錄攻擊者,因此你的 IP 就會被對方記錄。這個時候你要如何告知對方你的主機是由於被入侵所導致的問題, 並且協助對方繼續往惡意來源追查呢?呵呵!此時登錄檔可是相當重要的呢!

Tips 鳥哥 所以我們常說『天助自助者』是真的啦!你可以透過 (1)察看螢幕上面的錯誤訊息與 (2)登錄檔的錯誤資訊,幾乎可以解決大部分的 Linux 問題!
  • Linux 常見的登錄檔檔名

登錄檔可以幫助我們瞭解很多系統重要的事件,包括登入者的部分資訊,因此登錄檔的權限通常是設定為僅有 root 能夠讀取而已。 而由於登錄檔可以記載系統這麼多的詳細資訊,所以啦,一個有經驗的主機管理員會隨時隨地查閱一下自己的登錄檔, 以隨時掌握系統的最新脈動!那麼常見的幾個登錄檔有哪些呢?一般而言,有下面幾個:

  • /var/log/boot.log
    開機的時候系統核心會去偵測與啟動硬體,接下來開始各種核心支援的功能啟動等。這些流程都會記錄在 /var/log/boot.log 裡面哩! 不過這個檔案只會存在這次開機啟動的資訊,前次開機的資訊並不會被保留下來!

  • /var/log/cron
    還記得第十五章例行性工作排程吧?你的 crontab 排程有沒有實際被進行? 進行過程有沒有發生錯誤?你的 /etc/crontab 是否撰寫正確?在這個登錄檔內查詢看看。

  • /var/log/dmesg
    記錄系統在開機的時候核心偵測過程所產生的各項資訊。由於 CentOS 預設將開機時核心的硬體偵測過程取消顯示, 因此額外將資料記錄一份在這個檔案中;

  • /var/log/lastlog
    可以記錄系統上面所有的帳號最近一次登入系統時的相關資訊。第十三章講到的 lastlog 指令就是利用這個檔案的記錄資訊來顯示的。

  • /var/log/maillog 或 /var/log/mail/*
    記錄郵件的往來資訊,其實主要是記錄 postfix (SMTP 協定提供者) 與 dovecot (POP3 協定提供者) 所產生的訊息啦。 SMTP 是發信所使用的通訊協定, POP3 則是收信使用的通訊協定。 postfix 與 dovecot 則分別是兩套達成通訊協定的軟體。

  • /var/log/messages
    這個檔案相當的重要,幾乎系統發生的錯誤訊息 (或者是重要的資訊) 都會記錄在這個檔案中; 如果系統發生莫名的錯誤時,這個檔案是一定要查閱的登錄檔之一。

  • /var/log/secure
    基本上,只要牽涉到『需要輸入帳號密碼』的軟體,那麼當登入時 (不管登入正確或錯誤) 都會被記錄在此檔案中。 包括系統的 login 程式、圖形介面登入所使用的 gdm 程式、 su, sudo 等程式、還有網路連線的 ssh, telnet 等程式, 登入資訊都會被記載在這裡;

  • /var/log/wtmp, /var/log/faillog
    這兩個檔案可以記錄正確登入系統者的帳號資訊 (wtmp) 與錯誤登入時所使用的帳號資訊 (faillog) ! 我們在第十章談到的 last 就是讀取 wtmp 來顯示的, 這對於追蹤一般帳號者的使用行為很有幫助!

  • /var/log/httpd/*, /var/log/samba/*
    不同的網路服務會使用它們自己的登錄檔案來記載它們自己產生的各項訊息!上述的目錄內則是個別服務所制訂的登錄檔。

常見的登錄檔就是這幾個,但是不同的 Linux distributions ,通常登錄檔的檔名不會相同 (除了 /var/log/messages 之外 )。所以說,你還是得要查閱你 Linux 主機上面的登錄檔設定資料, 才能知道你的登錄檔主要檔名喔!

  • 登錄檔所需相關服務 (daemon) 與程式

那麼這些登錄檔是怎麼產生的呢?基本上有兩種方式,一種是由軟體開發商自行定義寫入的登錄檔與相關格式, 例如 WWW 軟體 apache 就是這樣處理的。另一種則是由 Linux distribution 提供的登錄檔管理服務來統一管理。 你只要將訊息丟給這個服務後,他就會自己分門別類的將各種訊息放置到相關的登錄檔去!CentOS 提供 rsyslog.service 這個服務來統一管理登錄檔喔!

不過要注意的是,如果你任憑登錄檔持續記錄的話,由於系統產生的資訊天天都有,那麼你的登錄檔的容量將會長大到無法無天~ 如果你的登錄檔容量太大時,可能會導致大檔案讀寫效率不佳的問題 (因為要從磁碟讀入記憶體,越大的檔案消耗記憶體量越多)。 所以囉,你需要對登錄檔備份與更新。那...需要手動處理喔?當然不需要,我們可以透過 logrotate (登錄檔輪替) 這玩意兒來自動化處理登錄檔容量與更新的問題喔!

所謂的 logrotate 基本上,就是將舊的登錄檔更改名稱,然後建立一個空的登錄檔,如此一來, 新的登錄檔將重新開始記錄,然後只要將舊的登錄檔留下一陣子,嗯!那就可以達到將登錄檔『輪轉』的目的啦! 此外,如果舊的記錄 (大概要保存幾個月吧!) 保存了一段時間沒有問題,那麼就可以讓系統自動的將他砍掉, 免得佔掉很多寶貴的硬碟空間說!

總結一下,針對登錄檔所需的功能,我們需要的服務與程式有:

  • systemd-journald.service:最主要的訊息收受者,由 systemd 提供的;
  • rsyslog.service:主要登錄系統與網路等服務的訊息;
  • logrotate:主要在進行登錄檔的輪替功能。

由於我們著眼點在於想要瞭解系統上面軟體所產生的各項資訊,因此本章主要針對 rsyslog.service 與 logrotate 來介紹。 接著下來我們來談一談怎麼樣規劃這兩個玩意兒。就由 rsyslog.service 這支程式先談起吧!畢竟得先有登錄檔,才可以進行 logrotate 呀!您說是吧!

  • CentOS 7.x 使用 systemd 提供的 journalctl 日誌管理

CentOS 7 除了保有既有的 rsyslog.service 之外,其實最上游還使用了 systemd 自己的登錄檔日誌管理功能喔!他使用的是 systemd-journald.service 這個服務來支援的。基本上,系統由 systemd 所管理,那所有經由 systemd 啟動的服務,如果再啟動或結束的過程中發生一些問題或者是正常的訊息, 就會將該訊息由 systemd-journald.service 以二進位的方式記錄下來,之後再將這個訊息發送給 rsyslog.service 作進一步的記載。

systemd-journald.service 的記錄主要都放置於記憶體中,因此在存取方面效能比較好~我們也能夠透過 journalctl 以及 systemctl status unit.service 來查看各個不同服務的登錄檔! 這有個好處,就是登錄檔可以隨著個別服務讓你查閱,在單一服務的處理上面,要比跑到 /var/log/messages 去大海撈針來的簡易很多! 不過,因為 system-journald.service 裡面的很多觀念還是沿用 rsyslog.service 相關的資訊,所以,本章還是先從 rsyslog.service 先談起, 談完之後再以 journalctl 進一步了解 systemd 是怎麼去記錄登錄檔日誌功能的呦!

18.1.2 登錄檔內容的一般格式

一般來說,系統產生的訊息經過記錄下來的資料中,每條訊息均會記錄底下的幾個重要資料:

  • 事件發生的日期與時間;
  • 發生此事件的主機名稱;
  • 啟動此事件的服務名稱 (如 systemd, CROND 等) 或指令與函式名稱 (如 su, login..);
  • 該訊息的實際資料內容。

當然,這些資訊的『詳細度』是可以修改的,而且,這些資訊可以作為系統除錯之用呢! 我們拿登錄時一定會記載帳號資訊的 /var/log/secure 為例好了:

[root@study ~]# cat /var/log/secure
Aug 17 18:38:06 study login: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Aug 17 18:38:06 study login: ROOT LOGIN ON tty1
Aug 17 18:38:19 study login: pam_unix(login:session): session closed for user root
Aug 18 23:45:17 study sshd[18913]: Accepted password for dmtsai from 192.168.1.200 port 41524 ssh2
Aug 18 23:45:17 study sshd[18913]: pam_unix(sshd:session): session opened for user dmtsai by (uid=0)
Aug 18 23:50:25 study sudo: dmtsai : TTY=pts/0 ; PWD=/home/dmtsai ; USER=root ; COMMAND=/bin/su -
Aug 18 23:50:25 study su: pam_unix(su-l:session): session opened for user root by dmtsai(uid=0)
|--日期/時間---|--H--|-服務與相關函數-|-----------訊息說明------>

我們拿第一筆資料 (共兩行) 來說明好了,該資料是說:『在 08/17 的 18:38 左右,在名為 study 的這部主機系統上,由 login 這個程式產生的訊息,內容顯示 root 在 tty1 登入了,而相關的權限給予是透過 pam_unix 模組處理的 (共兩行資料)。』有夠清楚吧!那請您自行翻譯一下後面的幾條訊息內容是什麼喔!

其實還有很多的資訊值得查閱的呢!尤其是 /var/log/messages 的內容。記得一個好的系統管理員, 要常常去『巡視』登錄檔的內容喔!尤其是發生底下幾種情況時:

  • 當你覺得系統似乎不太正常時;
  • 某個 daemon 老是無法正常啟動時;
  • 某個使用者老是無法登入時;
  • 某個 daemon 執行過程老是不順暢時;

還有很多啦!反正覺得系統不太正常,就得要查詢查詢登錄檔就是了。

Tips 鳥哥 提供一個鳥哥常做的檢查方式。當我老是無法成功的啟動某個服務時,我會在最後一次啟動該服務後,立即檢查登錄檔, 先 (1)找到現在時間所登錄的資訊『第一欄位』; (2)找到我想要查詢的那個服務『第三欄位』, (3)最後再仔細的查閱第四欄位的資訊,來藉以找到錯誤點。

另外,不知道你會不會覺得很奇怪?為什麼登錄檔就是登錄本機的資料啊~那怎麼登錄檔格式中,第二個欄位項目是『主機名稱』啊? 這是因為登錄檔可以做成登錄檔伺服器,可以收集來自其他伺服器的登錄檔資料喔!所以囉,為了瞭解到該訊息主要是來自於哪一部主機, 當然得要有第二個欄位項目說明該資訊來自哪一部主機名稱囉!

18.2 rsyslog.service :記錄登錄檔的服務

上一小節提到說 Linux 的登錄檔主要是由 rsyslog.service 在負責,那麼你的 Linux 是否有啟動 rsyslog 呢?而且是否有設定開機時啟動呢?呵呵!檢查一下先:

[root@study ~]# ps aux | grep rsyslog
USER  PID %CPU %MEM    VSZ   RSS TTY  STAT START  TIME COMMAND
root  750  0.0  0.1 208012  4732 ?    Ssl  Aug17  0:00 /usr/sbin/rsyslogd -n
# 瞧!確實有啟動的!daemon 執行檔名為 rsyslogd 喔!

[root@study ~]# systemctl status rsyslog.service
rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled)
   Active: active (running) since Mon 2015-08-17 18:37:58 CST; 2 days ago
 Main PID: 750 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─750 /usr/sbin/rsyslogd -n
# 也有啟動這個服務,也有預設開機時也要啟動這個服務!OK!正常沒問題!!

看到 rsyslog.service 這個服務名稱了吧?所以知道他已經在系統中工作囉!好了,既然本章主要是講登錄檔的服務, 那麼 rsyslog.service 的設定檔在哪裡?如何設定?如果你的 Linux 主機想要當作整個區網的登錄檔伺服器時,又該如何設定? 底下就讓我們來玩玩這玩意!

18.2.1 rsyslog.service 的設定檔:/etc/rsyslog.conf

什麼?登錄檔還有設定檔?喔!不是啦~是 rsyslogd 這個 daemon 的設定檔啦! 我們現在知道 rsyslogd 可以負責主機產生的各個資訊的登錄,而這些資訊本身是有『嚴重等級』之分的, 而且,這些資料最終要傳送到哪個檔案去是可以修改的呢,所以我們才會在一開頭的地方講說, 每個 Linux distributions 放置的登錄檔檔名可能會有所差異啊!

基本上, rsyslogd 針對各種服務與訊息記錄在某些檔案的設定檔就是 /etc/rsyslog.conf, 這個檔案規定了『(1)什麼服務 (2)的什麼等級訊息 (3)需要被記錄在哪裡(裝置或檔案)』 這三個咚咚,所以設定的語法會是這樣:

服務名稱.[=!]訊息等級		訊息記錄的檔名或裝置或主機
# 底下以 mail 這個服務產生的 info 等級為例:
mail.info			/var/log/maillog_info
# 這一行說明:mail 服務產生的大於等於 info 等級的訊息,都記錄到 
# /var/log/maillog_info 檔案中的意思。

我們將上面的資料簡單的分為三部分來說明:

  • 服務名稱

rsyslogd 主要還是透過 Linux 核心提供的 syslog 相關規範來設定資料的分類的,Linux 的 syslog 本身有規範一些服務訊息, 你可以透過這些服務來儲存系統的訊息。Linux 核心的 syslog 認識的服務類型主要有底下這些: (可使用 man 3 syslog 查詢到相關的資訊,或查詢 syslog.h 這個檔案來了解的!)

相對序號服務類別說明
0 kern(kernel) 就是核心 (kernel) 產生的訊息,大部分都是硬體偵測以及核心功能的啟用
1 user 在使用者層級所產生的資訊,例如後續會介紹到的用戶使用 logger 指令來記錄登錄檔的功能
2 mail 只要與郵件收發有關的訊息記錄都屬於這個;
3 daemon 主要是系統的服務所產生的資訊,例如 systemd 就是這個有關的訊息!
4 auth 主要與認證/授權有關的機制,例如 login, ssh, su 等需要帳號/密碼的咚咚;
5 syslog 就是由 syslog 相關協定產生的資訊,其實就是 rsyslogd 這支程式本身產生的資訊啊!
6 lpr 亦即是列印相關的訊息啊!
7 news 與新聞群組伺服器有關的東西;
8 uucp 全名為 Unix to Unix Copy Protocol,早期用於 unix 系統間的程序資料交換;
9 cron 就是例行性工作排程 cron/at 等產生訊息記錄的地方;
10 authpriv 與 auth 類似,但記錄較多帳號私人的資訊,包括 pam 模組的運作等!
11 ftp 與 FTP 通訊協定有關的訊息輸出!
16~23 local0 ~ local7 保留給本機用戶使用的一些登錄檔訊息,較常與終端機互動。

上面談到的都是 Linux 核心的 syslog 函數自行制訂的服務名稱,軟體開發商可以透過呼叫上述的服務名稱來記錄他們的軟體。 舉例來說, sendmail 與 postfix 及 dovecot 都是與郵件有關的軟體,這些軟體在設計登錄檔記錄時,都會主動呼叫 syslog 內的 mail 服務名稱 (LOG_MAIL)。所以上述三個軟體 (sendmail, postfix, dovecot) 產生的訊息在 syslog 看起來,就會『是 mail 』類型的服務了。我們可以將這個概念繪製如底下的圖示來理解:

syslog 所制訂的服務名稱與軟體呼叫的方式
圖18.2.1、syslog 所制訂的服務名稱與軟體呼叫的方式

另外,每種服務所產生的資料量其實差異是很大的,舉例來說, mail 的登錄檔訊息多的要命, 每一封信件進入後, mail 至少需要記錄『寄信人的資訊;與收信者的訊息』等等; 而如果是用來做為工作站主機的,那麼登入者 (利用 login 登錄主機處理事情) 的數量一定不少,那個 authpriv 所管轄的內容可就多的要命了。

為了讓不同的資訊放置到不同的檔案當中,好讓我們分門別類的進行登錄檔的管理, 所以囉,將各種類別的服務之登錄檔,記錄在不同的檔案裡面,就是我們 /etc/rsyslog.conf 所要作的規範了!

  • 訊息等級

同一個服務所產生的訊息也是有差別的,有啟動時僅通知系統而已的一般訊息 (information), 有出現還不至於影響到正常運作的警告訊息 (warn) ,還有系統硬體發生嚴重錯誤時,所產生的重大問題訊息 (error 等等); 訊息到底有多少種嚴重的等級呢?基本上,Linux 核心的 syslog 將訊息分為七個主要的等級,根據 syslog.h 的定義,訊息名稱與數值的對應如下:

等級數值等級名稱說明
7debug 用來 debug (除錯) 時產生的訊息資料;
6info 僅是一些基本的訊息說明而已;
5notice 雖然是正常資訊,但比 info 還需要被注意到的一些資訊內容;
4warning
(warn)
警示的訊息,可能有問題,但是還不至於影響到某個 daemon 運作的資訊;基本上, info, notice, warn 這三個訊息都是在告知一些基本資訊而已,應該還不至於造成一些系統運作困擾;
3err
(error)
一些重大的錯誤訊息,例如設定檔的某些設定值造成該服務服法啟動的資訊說明, 通常藉由 err 的錯誤告知,應該可以瞭解到該服務無法啟動的問題呢!
2crit 比 error 還要嚴重的錯誤資訊,這個 crit 是臨界點 (critical) 的縮寫,這個錯誤已經很嚴重了喔!
1alert 警告警告,已經很有問題的等級,比 crit 還要嚴重!
0emerg
(panic)
疼痛等級,意指系統已經幾乎要當機的狀態! 很嚴重的錯誤資訊了。通常大概只有硬體出問題,導致整個核心無法順利運作,就會出現這樣的等級的訊息吧!

基本上,在 0(emerg) 到 6(info) 的等級之間,等級數值越高代表越沒事,等級靠近 0 則代表事情大條了!除了 0 到 6 之外還有兩個比較特殊的等級, 那就是 debug(錯誤偵測等級) 與 none (不需登錄等級) 兩個,當我們想要作一些錯誤偵測,或者是忽略掉某些服務的資訊時, 就用這兩個咚咚吧!

特別留意一下在訊息等級之前還有 .[=!] 的連結符號喔!他代表的意思是這樣的:

  • . :代表『比後面還要嚴重的等級 (含該等級) 都被記錄下來』的意思,例如: mail.info 代表只要是 mail 的資訊,而且該資訊等級嚴重於 info (含 info 本身)時,就會被記錄下來的意思。
  • .=:代表所需要的等級就是後面接的等級而已, 其他的不要!
  • .!:有點反向選擇的感覺,代表忽略大於等於這個等級的訊息! 亦即是低於這個等級的才會被紀錄的意思!

一般來說,我們比較常使用的是『.』這個連結符號啦!^_^

  • 訊息記錄的檔名或裝置或主機

再來則是這個訊息要放置在哪裡的設定了。通常我們使用的都是記錄的檔案啦!但是也可以輸出到裝置呦! 例如印表機之類的!也可以記錄到不同的主機上頭去呢!底下就是一些常見的放置處:

  • 檔案的絕對路徑:通常就是放在 /var/log 裡頭的檔案啦!
  • 印表機或其他:例如 /dev/lp0 這個印表機裝置
  • 使用者名稱:顯示給使用者囉!
  • 遠端主機:例如 @study.vbird.tsai 當然啦,要對方主機也能支援才行!
  • *:代表『目前在線上的所有人』,類似 wall 這個指令的意義!
  • 服務、daemon 與函數名稱

看完上面的說明,相信你一定會越來越迷糊!啊!怎麼會有 syslog, rsyslogd, rsyslog.service!見鬼~名稱都不相同!那是啥東西? 基本上,這幾個東西你應該要這樣看:

syslog 這個是 Linux 核心所提供的登錄檔設計指引,所有的要求大概都寫入道一個名為 syslog.h 的標頭檔案中。如果你想要開發與登錄檔有關的軟體, 那你就得要依循這個 syslog 函數的要求去設計才行!可以使用 man 3 syslog 去查詢一下相關的資料!
rsyslogd 為了要達成實際上進行訊息的分類所開發的一套軟體,所以,這就是最基本的 daemon 程式!
rsyslog.service 為了加入 systemd 的控制,因此 rsyslogd 的開發者設計的啟動服務腳本設定!

這樣簡單的分類,應該比較容易了解名稱上面的意義了吧?早期 CentOS 5.x 以前,要達成 syslog 的功能是由一隻名為 syslogd 的 daemon 來完成的, 從 CentOS 6 以來 (包含 CentOS 7) 則是透過 rsyslogd 這個 daemon 囉!

  • rsyslog.conf 語法練習

基本上,整個 rsyslog.conf 設定檔的內容參數大概就只是這樣而已,底下我們來思考一些例題,好讓你可以更清楚的知道如何設定 rsyslogd 啊!

例題:
如果我要將我的 mail 相關的資料給他寫入 /var/log/maillog 當中,那麼在 /etc/rsyslog.conf 的語法如何設計?
答:
基本的寫法是這樣的:
mail.info   /var/log/maillog
注意到上面喔,當我們的等級使用 info 時,那麼『任何嚴重於 info 等級(含 info 這個等級)之上的訊息, 都會被寫入到後面接的檔案之中!』這樣可以瞭解嗎?也就是說,我們可以將所有 mail 的登錄資訊都記錄在 /var/log/maillog 裡面的意思啦!

例題:
我要將新聞群組資料 (news) 及例行性工作排程 (cron) 的訊息都寫入到一個稱為 /var/log/cronnews 的檔案中,但是這兩個程序的警告訊息則額外的記錄在 /var/log/cronnews.warn 中, 那該如何設定我的 rsyslog.conf 呢?
答:
很簡單啦!既然是兩個程序,那麼只好以分號來隔開了,此外,由於第二個指定檔案中,我只要記錄警告訊息, 因此設定上需要指定『.=』這個符號,所以語法成為了:
news.*;cron.*     /var/log/cronnews
news.=warn;cron.=warn /var/log/cronnews.warn
上面那個『.=』就是在指定等級的意思啦!由於指定了等級,因此,只有這個等級的訊息才會被記錄在這個檔案裡面呢! 此外你也必須要注意,news 與 cron 的警告訊息也會寫入 /var/log/cronnews 內喔!

例題:
我的 messages 這個檔案需要記錄所有的資訊,但是就是不想要記錄 cron, mail 及 news 的資訊,那麼應該怎麼寫才好?
答:
可以有兩種寫法,分別是:
*.*;news,cron,mail.none      /var/log/messages
*.*;news.none;cron.none;mail.none /var/log/messages
使用『,』分隔時,那麼等級只要接在最後一個即可,如果是以『;』來分的話, 那麼就需要將服務與等級都寫上去囉!這樣會設定了吧!

  • CentOS 7.x 預設的 rsyslog.conf 內容

瞭解語法之後,我們來看一看 rsyslogd 有哪些系統服務已經在記錄了呢?就是瞧一瞧 /etc/rsyslog.conf 這個檔案的預設內容囉! (注意!如果需要將該行做為註解時,那麼就加上 # 符號就可以啦)

# 來自 CentOS 7.x 的相關資料
[root@study ~]# vim /etc/rsyslog.conf
 1 #kern.*                                              /dev/console
 2 *.info;mail.none;authpriv.none;cron.none             /var/log/messages
 3 authpriv.*                                           /var/log/secure
 4 mail.*                                              -/var/log/maillog
 5 cron.*                                               /var/log/cron
 6 *.emerg                                              :omusrmsg:*
 7 uucp,news.crit                                       /var/log/spooler
 8 local7.*                                             /var/log/boot.log

上面總共僅有 8 行設定值,每一行的意義是這樣的:

  1. #kern.*:只要是核心產生的訊息,全部都送到 console(終端機) 去。console 通常是由外部裝置連接到系統而來, 舉例來說,很多封閉型主機 (沒有鍵盤、螢幕的系統) 可以透過連接 RS232 連接口將訊息傳輸到外部的系統中, 例如以筆記型電腦連接到封閉主機的 RS232 插口。這個項目通常應該是用在系統出現嚴重問題而無法使用預設的螢幕觀察系統時, 可以透過這個項目來連接取得核心的訊息。(註1)

  2. *.info;mail.none;authpriv.none;cron.none:由於 mail, authpriv, cron 等類別產生的訊息較多, 且已經寫入底下的數個檔案中,因此在 /var/log/messages 裡面就不記錄這些項目。除此之外的其他訊息都寫入 /var/log/messages 中。這也是為啥我們說這個 messages 檔案很重要的緣故!

  3. authpriv.*:認證方面的訊息均寫入 /var/log/secure 檔案;

  4. mail.*:郵件方面的訊息則均寫入 /var/log/maillog 檔案;

  5. cron.*:例行性工作排程均寫入 /var/log/cron 檔案;

  6. *.emerg:當產生最嚴重的錯誤等級時,將該等級的訊息以 wall 的方式廣播給所有在系統登入的帳號得知, 要這麼做的原因是希望在線的使用者能夠趕緊通知系統管理員來處理這麼可怕的錯誤問題。

  7. uucp,news.crit:uucp 是早期 Unix-like 系統進行資料傳遞的通訊協定,後來常用在新聞群組的用途中。 news 則是新聞群組。當新聞群組方面的資訊有嚴重錯誤時就寫入 /var/log/spooler 檔案中;

  8. local7.*:將本機開機時應該顯示到螢幕的訊息寫入到 /var/log/boot.log 檔案中;

在上面的第四行關於 mail 的記錄中,在記錄的檔案 /var/log/maillog 前面還有個減號『 - 』是幹嘛用的?由於郵件所產生的訊息比較多,因此我們希望郵件產生的訊息先儲存在速度較快的記憶體中 (buffer) ,等到資料量夠大了才一次性的將所有資料都填入磁碟內,這樣將有助於登錄檔的存取性能。 只不過由於訊息是暫存在記憶體內,因此若不正常關機導致登錄資訊未回填到登錄檔中,可能會造成部分資料的遺失。

此外,每個 Linux distributions 的 rsyslog.conf 設定差異是頗大的,如果你想要找到相對應的登錄資訊時, 可得要查閱一下 /etc/rsyslog.conf 這個檔案才行!否則可能會發生分析到錯誤的資訊喔!舉例來說, 鳥哥有自己寫一支分析登錄檔的 script,這個 script 是依據 Red Hat 系統預設的登錄檔所寫的,因此不同的 distributions 想要使用這支程式時,就得要自行設計與修改一下 /etc/rsyslog.conf 才行喔!否則就可能會分析到錯誤的資訊囉。 那麼如果你有自己的需要而得要修訂登錄檔時,該如何進行?

  • 自行增加登錄檔檔案功能

如果你有其他的需求,所以需要特殊的檔案來幫你記錄時,呵呵!別客氣,千萬給他記錄在 /etc/rsyslog.conf 當中,如此一來,你就可以重複的將許多的資訊記錄在不同的檔案當中,以方便你的管理呢! 讓我們來作個練習題吧!如果你想要讓『所有的資訊』都額外寫入到 /var/log/admin.log 這個檔案時, 你可以怎麼作呢?先自己想一想,並且作一下,再來看看底下的作法啦!

# 1. 先設定好所要建立的檔案設置!
[root@study ~]# vim /etc/rsyslog.conf
# Add by VBird 2015/08/19       <==再次強調,自己修改的時候加入一些說明
*.info      /var/log/admin.log  <==有用的是這行啦!

# 2. 重新啟動 rsyslogd 呢!
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# ll /var/log/admin.log
-rw-r--r--. 1 root root 325 Aug 20 00:54 /var/log/admin.log
# 瞧吧!建立了這個登錄檔出現囉!

很簡單吧!如此一來,所有的資訊都會寫入 /var/log/admin.log 裡面了!

18.2.2 登錄檔的安全性設置

好了,由上一個小節裡面我們知道了 rsyslog.conf 的設定,也知道了登錄檔內容的重要性了, 所以,如果幻想你是一個很厲害的駭客,想利用他人的電腦幹壞事,然後又不想留下證據, 你會怎麼作?對啦!就是離開的時候將屁股擦乾淨,將所有可能的訊息都給他抹煞掉, 所以第一個動腦筋的地方就是登錄檔的清除工作啦~ 如果你的登錄檔不見了,那該怎辦?

Tips 鳥哥 哇!鳥哥教人家幹壞事……喂!不要亂講話~俺的意思是,如果改天你發現你的登錄檔不翼而飛了, 或者是發現你的登錄檔似乎不太對勁的時候,最常發現的就是網友常常會回報說,他的 /var/log 這個目錄『不見了!』不要笑!這是真的事情!請記得,『趕快清查你的系統!』

傷腦筋呢!有沒有辦法防止登錄檔被刪除?或者是被 root 自己不小心變更呢?有呀!拔掉網路線或電源線就好了……呵呵! 別擔心,基本上,我們可以透過一個隱藏的屬性來設定你的登錄檔,成為『 只可以增加資料,但是不能被刪除 』的狀態,那麼或許可以達到些許的保護!不過,如果你的 root 帳號被破解了,那麼底下的設定還是無法保護的,因為你要記得『 root 是可以在系統上面進行任何事情的 』,因此,請將你的 root 這個帳號的密碼設定的安全一些!千萬不要輕忽這個問題呢!

Tips 鳥哥 為什麼登錄檔還要防止被自己 (root) 不小心所修改過呢? 鳥哥在教 Linux 的課程時,我的學生常常會舉手說:『老師,我的登錄檔不能記錄資訊了!糟糕!是不是被入侵了啊?』 怪怪!明明是電腦教室的主機,使用的是 Private IP 而且學校計中還有抵擋機制,不可能被攻擊吧? 查詢了才知道原來同學很喜歡使用『 :wq 』來離開 vim 的環境,但是 rsyslogd 的登錄檔只要『被編輯過』就無法繼續記錄! 所以才會導致不能記錄的問題。此時你得要 (1)改變使用 vim 的習慣; (2)重新啟動 rsyslog.service 讓他再繼續提供服務才行喔!

既然如此,那麼我們就來處理一下隱藏屬性的東東吧!我們在第六章談到過 lsattrchattr 這兩個東西啦!如果將一個檔案以 chattr 設定 i 這個屬性時,那麼該檔案連 root 都不能殺掉!而且也不能新增資料,嗯!真安全!但是,如此一來登錄檔的功能豈不是也就消失了? 因為沒有辦法寫入呀!所以囉,我們要使用的是 a 這個屬性!你的登錄檔如果設定了這個屬性的話,那麼 他將只能被增加,而不能被刪除!嗯! 這個項目就非常的符合我們登錄檔的需求啦!因此,你可以這樣的增加你的登錄檔的隱藏屬性。

Tips 鳥哥 請注意,底下的這個 chattr 的設定狀態:『僅適合已經對 Linux 系統很有概念的朋友』來設定, 對於新手來說,建議你直接使用系統的預設值就好了,免得到最後登錄檔無法寫入~ 那就比較糗一點! @_@
[root@study ~]# chattr +a /var/log/admin.log
[root@study ~]# lsattr /var/log/admin.log
-----a---------- /var/log/admin.log

加入了這個屬性之後,你的 /var/log/admin.log 登錄檔從此就僅能被增加,而不能被刪除,直到 root 以『 chattr -a /var/log/admin.log 』取消這個 a 的參數之後,才能被刪除或移動喔!

雖然,為了你登錄檔的資訊安全,這個 chattr 的 +a 旗標可以幫助你維護好這個檔案, 不過,如果你的系統已經被取得 root 的權限,而既然 root 可以下達 chattr -a 來取消這個旗標, 所以囉,還是有風險的啦!此外,前面也稍微提到,新手最好還是先不要增加這個旗標, 很容易由於自己的忘記,導致系統的重要訊息無法記錄呢。

基本上,鳥哥認為,這個旗標最大的用處除了在保護你登錄檔的資料外, 他還可以幫助你避免掉不小心寫入登錄檔的狀況喔。要注意的是,當『 你不小心 "手動" 更動過登錄檔後,例如那個 /var/log/messages , 你不小心用 vi 開啟他,離開卻下達 :wq 的參數,呵呵!那麼該檔案未來將不會再繼續進行登錄動作! 』這個問題真的很常發生!由於你以 vi 儲存了登錄檔,則 rsyslogd 會誤判為該檔案已被更動過, 將導致 rsyslogd 不再寫入該檔案新的內容~很傷腦筋的!

要讓該登錄檔可以繼續寫入,你只要重新啟動 rsyslogd.service 即可。 不過,總是比較麻煩。所以啊,如果你針對登錄檔下達 chattr +a 的參數,嘿嘿! 未來你就不需要害怕不小心更動到該檔案了!因為無法寫入嘛!除了可以新增之外~ ^_^

不過,也因為這個 +a 的屬性讓該檔案無法被刪除與修改,所以囉,當我們進行登錄檔案輪替時 (logrotate) ,將會無法移動該登錄檔的檔名呢!所以會造成很大的困擾。這個困擾雖然可以使用 logrotate 的設定檔來解決,但是,還是先將登錄檔的 +a 旗標拿掉吧!

[root@study ~]# chattr -a /var/log/admin.log

18.2.3 登錄檔伺服器的設定

我們在之前稍微提到的,在 rsyslog.conf 檔案當中,可以將登錄資料傳送到印表機或者是遠端主機上面去。這樣做有什麼意義呢? 如果你將登錄資訊直接傳送到印表機上面的話,那麼萬一不小心你的系統被 cracker 所入侵, 他也將你的 /var/log/ 砍掉了,怎麼辦?沒關係啊!反正你已經將重要資料直接以印表機記錄起來了, 嘿嘿!他是無法逃開的啦!^_^

再想像一個環境,你的辦公室內有十部 Linux 主機,每一部負責一個網路服務, 你為了要瞭解每部主機的狀態,因此,你常常需要登入這十部主機去查閱你的登錄檔~ 哇!光用想的,每天要進入十部主機去查資料,想到就煩~沒關係~這個時候我們可以讓某一部主機當成 『登錄檔伺服器』,用他來記錄所有的十部 linux 主機的資訊,嘿嘿!這樣我就直接進入一部主機就可以了! 省時又省事,真方便~

那要怎麼達到這樣的功能呢?很簡單啦,我們 CentOS 7.x 預設的 rsyslogd 本身就已經具有這個登錄檔伺服器的功能了, 只是預設並沒有啟動該功能而已。你可以透過 man rsyslogd 去查詢一下相關的選項就能夠知道啦! 既然是登錄檔伺服器,那麼我們的 Linux 主機當然會啟動一個埠口來監聽了,那個預設的埠口就是 UDP 或 TCP 的 port 514 喔!

登錄檔伺服器的架構
圖18.2.2、登錄檔伺服器的架構

如上圖所示,伺服器會啟動監聽的埠口,用戶端則將登錄檔再轉出一份送到伺服器去。 而既然是登錄檔『伺服器』,所以當然有伺服器與用戶端 (client) 囉!這兩者的設定分別是這樣的:

# 1. Server 端:修改 rsyslogd 的啟動設定檔,在 /etc/rsyslog.conf 內!
[root@study ~]# vim /etc/rsyslog.conf
# 找到底下這幾行:
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
# 上面的是 UDP 埠口,底下的是 TCP 埠口!如果你的網路狀態很穩定,就用 UDP 即可。
# 不過,如果你想要讓資料比較穩定傳輸,那麼建議使用 TCP 囉!所以修改底下兩行即可!
$ModLoad imtcp
$InputTCPServerRun 514 

# 2. 重新啟動與觀察 rsyslogd 喔!
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# netstat -ltnp | grep syslog
Proto Recv-Q Send-Q Local Address  Foreign Address   State    PID/Program name
tcp        0      0 0.0.0.0:514    0.0.0.0:*         LISTEN   2145/rsyslogd
tcp6       0      0 :::514         :::*              LISTEN   2145/rsyslogd
# 嘿嘿!你的登錄檔主機已經設定妥當囉!很簡單吧!

透過這個簡單的動作,你的 Linux 主機已經可以接收來自其他主機的登錄資訊了! 當然啦,你必須要知道網路方面的相關基礎,這裡鳥哥只是先介紹,未來瞭解了網路相關資訊後,再回頭來這裡瞧一瞧先! ^_^

至於 client 端的設定就簡單多了!只要指定某個資訊傳送到這部主機即可! 舉例來說,我們的登錄檔伺服器 IP 為 192.168.1.100 ,而 client 端希望所有的資料都送給主機, 所以,可以在 /etc/rsyslog.conf 裡面新增這樣的一行:

[root@study ~]# vim /etc/rsyslog.conf
*.*       @@192.168.1.100
#*.*       @192.168.1.100  # 若用 UDP 傳輸,設定要變這樣!

[root@study ~]# systemctl restart rsyslog.service

再重新啟動 rsyslog.service 後,立刻就搞定了!而未來主機上面的登錄檔當中,每一行的『主機名稱』就會顯示來自不同主機的資訊了。 很簡單吧! ^_^。不過你得要特別注意,使用 TCP 傳輸與 UDP 傳輸的設定不太一樣!請依據你的登錄檔伺服器的設定值來選擇你的用戶端語法喔! 接下來,讓我們來談一談,那麼如何針對登錄檔來進行輪替 (rotate) 呢?

18.3 登錄檔的輪替(logrotate)

假設我們已經將登錄資料寫入了記錄檔中了,也已經利用 chattr 設定了 +a 這個屬性了,那麼該如何進行 logrotate 的工作呢?這裡請特別留意的是:『rsyslogd 利用的是 daemon 的方式來啟動的, 當有需求的時候立刻就會被執行的,但是 logrotate 卻是在規定的時間到了之後才來進行登錄檔的輪替, 所以這個 logrotate 程序當然就是掛在 cron 底下進行的呦!』 仔細看一下 /etc/cron.daily/ 裡面的檔案,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是記錄了每天要進行的登錄檔輪替的行為啦! ^_^!底下我們就來談一談怎麼樣設計這個 logrotate 吧!

18.3.1 logrotate 的設定檔

既然 logrotate 主要是針對登錄檔來進行輪替的動作,所以囉,他當然必須要記載『 在什麼狀態下才將登錄檔進行輪替』的設定啊!那麼 logrotate 這個程式的參數設定檔在哪裡呢?呵呵!那就是:

  • /etc/logrotate.conf
  • /etc/logrotate.d/

那個 logrotate.conf 才是主要的參數檔案,至於 logrotate.d 是一個目錄, 該目錄裡面的所有檔案都會被主動的讀入 /etc/logrotate.conf 當中來進行!另外,在 /etc/logrotate.d/ 裡面的檔案中,如果沒有規定到的一些細部設定,則以 /etc/logrotate.conf 這個檔案的規定來指定為預設值!

好了,剛剛我們提到 logrotate 的主要功能就是將舊的登錄檔案移動成舊檔, 並且重新建立一個新的空的檔案來記錄,他的執行結果有點類似底下的圖示:

登錄檔進行 logrotate 的結果
圖18.3.1、登錄檔進行 logrotate 的結果

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

不過近年來磁碟空間容量比較大了,加上管理員又擔心登錄檔資料真的給它不見去,因此,你可能已經發現到,最近的登錄檔輪替後的檔名已經會加上日期參數, 然後源源不絕的保留在你的系統上耶~雖然這個設定是可以修訂的,不過,鳥哥也真的希望保留日期的檔名延伸記錄,真的比較不用擔心未來要找問題時, 登錄檔卻已經 GG 了...

那麼多久進行一次這樣的 logrotate 工作呢?這些都記錄在 logrotate.conf 裡面,我們來看一下預設的 logrotate 的內容吧!

[root@study ~]# vim /etc/logrotate.conf
# 底下的設定是 "logrotate 的預設設定值" ,如果個別的檔案設定了其他的參數,
# 則將以個別的檔案設定為主,若該檔案沒有設定到的參數則以這個檔案的內容為預設值!

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

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

/var/log/wtmp {       <==僅針對 /var/log/wtmp 所設定的參數
    monthly           <==每個月一次,取代每週!
    create 0664 root utmp <==指定新建檔案的權限與所屬帳號/群組
    minsize 1M        <==檔案容量一定要超過 1M 後才進行 rotate (略過時間參數)
    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 左右,以保存較多的備份檔案。不過如果已經加上 dateext 的參數,那這個項目就不用更動了!
  • 大部分的登錄檔不需要 compress 囉!但是空間太小就需要 compress !尤其是很佔硬碟空間的 httpd 更需要 compress 的!

好了,上面我們大致介紹了 /var/log/wtmp 這個檔案的設定,現在你知道了 logrotate.conf 的設定語法是:

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

底下我們再以 /etc/logrotate.d/syslog 這個輪替 rsyslog.service 服務的檔案,來看看該如何設定他的 rotate 呢?

[root@study ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

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

  • 檔名:被處理的登錄檔絕對路徑檔名寫在前面,可以使用空白字元分隔多個登錄檔;
  • 參數:上述檔名進行輪替的參數使用 { } 包括起來;
  • 執行腳本:可呼叫外部指令來進行額外的命令下達,這個設定需與 sharedscripts .... endscript 設定合用才行。至於可用的環境為:
    • prerotate:在啟動 logrotate 之前進行的指令,例如修改登錄檔的屬性等動作;
    • postrotate:在做完 logrotate 之後啟動的指令,例如重新啟動 (kill -HUP) 某個服務!
    • Prerotate 與 postrotate 對於已加上特殊屬性的檔案處理上面,是相當重要的執行程序!

那麼 /etc/logrotate.d/syslog 內設定的 5 個檔案的輪替功能就變成了:

  • 該設定只對 /var/log/ 內的 cron, maillog, messages, secure, spooler 有效;
  • 登錄檔輪替每週一次、保留四個、且輪替下來的登錄檔不進行壓縮(未更改預設值);
  • 輪替完畢後 (postrotate) 取得 syslog 的 PID 後,以 kill -HUP 重新啟動 syslogd

假設我們有針對 /var/log/messages 這個檔案增加 chattr +a 的屬性時, 依據 logrotate 的工作原理,我們知道,這個 /var/log/messages 將會被更名成為 /var/log/messages.1 才是。但是由於加上這個 +a 的參數啊,所以更名是不可能成功的! 那怎麼辦呢?呵呵!就利用 prerotate 與 postrotate 來進行登錄檔輪替前、後所需要作的動作啊! 果真如此時,那麼你可以這樣修改一下這個檔案喔!

[root@study ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    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
        /usr/bin/chattr +a /var/log/messages
    endscript
}

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

18.3.2 實際測試 logrotate 的動作

好了,設定完成之後,我們來測試看看這樣的設定是否可行呢?給他執行底下的指令:

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

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

範例二:強制進行 logrotate 的動作
[root@study ~]# logrotate -vf /etc/logrotate.conf
....(前面省略)....
rotating log /var/log/messages, log->rotateCount is 52
dateext suffix '-20150820'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
....(底下省略)....
# 看到否?整個 rotate 的動作就是這樣一步一步進行的~

[root@study ~]# ll /var/log/messages*; lsattr /var/log/messages
-rw-------. 1 root root    143 Aug 20 01:45 /var/log/messages
-rw-------. 1 root root 167125 Aug 20 01:40 /var/log/messages-20150820
-----a---------- /var/log/messages  <==主動加入 a 的隱藏屬性囉!

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

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

Aug 20 01:45:34 study rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="2145" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

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

18.3.3 自訂登錄檔的輪替功能

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

  • 登錄檔輪替一個月進行一次;
  • 該登錄檔若大於 10MB 時,則主動進行輪替,不需要考慮一個月的期限;
  • 保存五個備份檔案;
  • 備份檔案需要壓縮

那你可以怎麼樣設定呢?呵呵~很簡單啊!看看底下的動作吧!

# 1. 先建立 +a 這個屬性啊!
[root@study ~]# chattr +a /var/log/admin.log
[root@study ~]# lsattr /var/log/admin.log
-----a---------- /var/log/admin.log
[root@study ~]# 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@study ~]# vim /etc/logrotate.d/admin
# This configuration is from VBird 2015/08/19
/var/log/admin.log {
        monthly   <==每個月進行一次
        size=10M  <==檔案容量大於 10M 則開始處置
        rotate 5  <==保留五個!
        compress  <==進行壓縮工作!
        sharedscripts
        prerotate
                /usr/bin/chattr -a /var/log/admin.log
        endscript
        sharedscripts
        postrotate
                /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
                /usr/bin/chattr +a /var/log/admin.log
        endscript
}

# 3. 測試一下 logrotate 相關功能的資訊顯示:
[root@study ~]# 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@study ~]# logrotate -vf /etc/logrotate.d/admin
reading config file /etc/logrotate.d/admin
reading config file /etc/logrotate.d/admin

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
dateext suffix '-20150820'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
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
fscreate context set to system_u:object_r:var_log_t:s0
renaming /var/log/admin.log to /var/log/admin.log.1
running postrotate script
compressing log with: /bin/gzip

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

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

18.4 systemd-journald.service 簡介

過去只有 rsyslogd 的年代中,由於 rsyslogd 必須要開機完成並且執行了 rsyslogd 這個 daemon 之後,登錄檔才會開始記錄。所以,核心還得要自己產生一個 klogd 的服務, 才能將系統在開機過程、啟動服務的過程中的資訊記錄下來,然後等 rsyslogd 啟動後才傳送給它來處理~

現在有了 systemd 之後,由於這玩意兒是核心喚醒的,然後又是第一支執行的軟體,它可以主動呼叫 systemd-journald 來協助記載登錄檔~ 因此在開機過程中的所有資訊,包括啟動服務與服務若啟動失敗的情況等等,都可以直接被記錄到 systemd-journald 裡頭去!

不過 systemd-journald 由於是使用於記憶體的登錄檔記錄方式,因此重新開機過後,開機前的登錄檔資訊當然就不會被記載了。 為此,我們還是建議啟動 rsyslogd 來協助分類記錄!也就是說, systemd-journald 用來管理與查詢這次開機後的登錄資訊,而 rsyslogd 可以用來記錄以前及現在的所以資料到磁碟檔案中,方便未來進行查詢喔!

Tips 鳥哥 雖然 systemd-journald 所記錄的資料其實是在記憶體中,但是系統還是利用檔案的型態將它記錄到 /run/log/ 底下! 不過我們從前面幾章也知道, /run 在 CentOS 7 其實是記憶體內的資料,所以重新開機過後,這個 /run/log 底下的資料當然就被刷新,舊的當然就不再存在了!

18.4.1 使用 journalctl 觀察登錄資訊

那麼 systemd-journald.service 的資料要如何叫出來查閱呢?很簡單!就透過 journalctl 即可!讓我們來瞧瞧這個指令可以做些什麼事?

[root@study ~]# journalctl [-nrpf] [--since TIME] [--until TIME] _optional
選項與參數:
預設會秀出全部的 log 內容,從舊的輸出到最新的訊息
-n  :秀出最近的幾行的意思~找最新的資訊相當有用
-r  :反向輸出,從最新的輸出到最舊的資料
-p  :秀出後面所接的訊息重要性排序!請參考前一小節的 rsyslogd 資訊
-f  :類似 tail -f 的功能,持續顯示 journal 日誌的內容(即時監測時相當有幫助!)
--since --until:設定開始與結束的時間,讓在該期間的資料輸出而已
_SYSTEMD_UNIT=unit.service :只輸出 unit.service 的資訊而已
_COMM=bash :只輸出與 bash 有關的資訊
_PID=pid   :只輸出 PID 號碼的資訊
_UID=uid   :只輸出 UID 為 uid 的資訊
SYSLOG_FACILITY=[0-23] :使用 syslog.h 規範的服務相對序號來呼叫出正確的資料!

範例一:秀出目前系統中所有的 journal 日誌資料
[root@study ~]# journalctl
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 00:01:01 CST. --
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max 
 142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max
 142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpuset
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpu
.....(中間省略).....
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19268]: finished 0anacron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19270]: starting 0yum-hourly.cron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19274]: finished 0yum-hourly.cron
# 從這次開機以來的所有資料都會顯示出來!透過 less 一頁頁翻動給管理員查閱!資料量相當大!

範例二:(1)僅顯示出 2015/08/18 整天以及(2)僅今天及(3)僅昨天的日誌資料內容
[root@study ~]# journalctl --since "2015-08-18 00:00:00" --until "2015-08-19 00:00:00"
[root@study ~]# journalctl --since today
[root@study ~]# journalctl --since yesterday --until today

範例三:只找出 crond.service 的資料,同時只列出最新的 10 筆即可
[root@study ~]# journalctl _SYSTEMD_UNIT=crond.service -n 10

範例四:找出 su, login 執行的登錄檔,同時只列出最新的 10 筆即可
[root@study ~]# journalctl _COMM=su _COMM=login -n 10

範例五:找出訊息嚴重等級為錯誤 (error) 的訊息!
[root@study ~]# journalctl -p err

範例六:找出跟登錄服務 (auth, authpriv) 有關的登錄檔訊息
[root@study ~]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
# 更多關於 syslog_facility 的資料,請參考 18.2.1 小節的內容囉!

基本上,有 journalctl 就真的可以搞定你的訊息資料囉!全部的資料都在這裡面耶~再來假設一下,你想要了解到登錄檔的即時變化, 那又該如何處置呢?現在,請開兩個終端機,讓我們來處理處理!

# 第一號終端機,請使用底下的方式持續偵測系統!
[root@study ~]# journalctl -f
# 這時系統會好像卡住~其實不是卡住啦!是類似 tail -f 在持續的顯示登錄檔資訊的!

# 第二號終端機,使用底下的方式隨便發一封 email 給系統上的帳號!
[root@study ~]# echo "testing" | mail -s 'tset' dmtsai
# 這時,你會發現到第一號終端機竟然一直輸出一些訊息吧!沒錯!這就對了!

如果你有一些必須要偵測的行為,可以使用這種方式來即時了解到系統出現的訊息~而取消 journalctl -f 的方法,就是 [ctrl]+c 啊!

18.4.2 logger 指令的應用

上面談到的是叫出登錄檔給我們查閱,那換個角度想,『如果你想要讓你的資料儲存到登錄檔當中』呢?那該如何是好? 這時就得要使用 logger 這個好用的傢伙了!這個傢伙可以傳輸很多資訊,不過,我們只使用最簡單的本機資訊傳遞~ 更多的用法就請您自行 man logger 囉!

[root@study ~]# logger [-p 服務名稱.等級] "訊息"
選項與參數:
服務名稱.等級 :這個項目請參考 rsyslogd 的本章後續小節的介紹;

範例一:指定一下,讓 dmtsai 使用 logger 來傳送資料到登錄檔內
[root@study ~]# logger -p user.info "I will check logger command"
[root@study ~]# journalctl SYSLOG_FACILITY=1 -n 3
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 18:03:17 CST. --
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29710]: starting 0yum-hourly.cron
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29714]: finished 0yum-hourly.cron
Aug 19 18:03:17 study.centos.vbird dmtsai[29753]: I will check logger command

現在,讓我們來瞧一瞧,如果我們之前寫的 backup.service 服務中,如果使用手動的方式來備份,亦即是使用 "/backups/backup.sh log" 來執行備份時, 那麼就透過 logger 來記錄備份的開始與結束的時間!該如何是好呢?這樣作看看!

[root@study ~]# vim /backups/backup.sh
#!/bin/bash

if [ "${1}" == "log" ]; then
        logger -p syslog.info "backup.sh is starting"
fi
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log
if [ "${1}" == "log" ]; then
        logger -p syslog.info "backup.sh is finished"
fi

[root@study ~]# /backups/backup.sh log
[root@study ~]# journalctl SYSLOG_FACILITY=5 -n 3
Aug 19 18:09:37 study.centos.vbird dmtsai[29850]: backup.sh is starting
Aug 19 18:09:54 study.centos.vbird dmtsai[29855]: backup.sh is finished

透過這個玩意兒,我們也能夠將資料自行處置到登錄檔當中囉!

18.2.3 保存 journal 的方式

再強調一次,這個 systemd-journald.servicd 的訊息是不會放到下一次開機後的,所以,重新開機後,那之前的記錄通通會遺失。 雖然我們大概都有啟動 rsyslogd 這個服務來進行後續的登錄檔放置,不過如果你比較喜歡 journalctl 的存取方式,那麼可以將這些資料儲存下來喔!

基本上,systemd-journald.service 的設定檔主要參考 /etc/systemd/journald.conf 的內容,詳細的參數你可以參考 man 5 journald.conf 的資料。 因為預設的情況底下,設定檔的內容應該已經符合我們的需求,所以這邊鳥哥就不再修改設定檔了。只是如果想要保存你的 journalctl 所讀取的登錄檔, 那麼就得要建立一個 /var/log/journal 的目錄,並且處理一下該目錄的權限,那麼未來重新啟動 systemd-journald.service 之後, 日誌登錄檔就會主動的複製一份到 /var/log/journal 目錄下囉!

# 1. 先處理所需要的目錄與相關權限設定
[root@study ~]# mkdir /var/log/journal
[root@study ~]# chown root:systemd-journal /var/log/journal
[root@study ~]# chmod 2775 /var/log/journal

# 2. 重新啟動 systemd-journald 並且觀察備份的日誌資料!
[root@study ~]# systemctl restart systemd-journald.service
[root@study ~]# ll /var/log/journal/
drwxr-sr-x. 2 root systemd-journal 27 Aug 20 02:37 309eb890d09f440681f596543d95ec7a

你得要注意的是,因為現在整個日誌登錄檔的容量會持續長大,因此你最好還是觀察一下你系統能用的總容量喔!避免不小心檔案系統的容量被灌爆! 此外,未來在 /run/log 底下就沒有相關的日誌可以觀察了!因為移動到 /var/log/journal 底下來囉!

其實鳥哥是這樣想的,既然我們還有 rsyslog.service 以及 logrotate 的存在,因此這個 systemd-journald.service 產生的登錄檔, 個人建議最好還是放置到 /run/log 的記憶體當中,以加快存取的速度!而既然 rsyslog.service 可以存放我們的登錄檔, 似乎也沒有必要再保存一份 journal 登錄檔到系統當中就是了。單純的建議!如何處理,依照您的需求即可喔!

18.5 分析登錄檔

登錄檔的分析是很重要的!你可以自行以 vim 或者是 journalctl 進入登錄檔去查閱相關的資訊。而系統也提供一些軟體可以讓你從登錄檔中取得資料, 例如之前談過的 last, lastlog, dmesg 等等指令。不過,這些資料畢竟都非常的分散,如果你想要一口氣讀取所有的登錄資訊, 其實有點困擾的。不過,好在 CentOS 有提供 logwatch 這個登錄檔分析程式,你可以藉由該程式來瞭解登錄檔資訊。 此外,鳥哥也依據 Red Hat 系統的 journalctl 搭配 syslog 函數寫了一支小程式給大家使用喔!

18.5.1 CentOS 預設提供的 logwatch

雖然有一些有用的系統指令,不過,要瞭解系統的狀態,還是得要分析整個登錄檔才行~ 事實上,目前已經有相當多的登錄檔分析工具,例如 CentOS 7.x 上面預設的 logwatch 這個套件所提供的分析工具, 他會每天分析一次登錄檔案,並且將資料以 email 的格式寄送給 root 呢! 你也可以直接到 logwatch 的官方網站上面看看:

不過在我們的安裝方式裡面,預設並沒有安裝 logwatch 就是了!所以,我們先來安裝一下 logwatch 這套軟體再說。假設你已經將 CentOS 7.1 的原版光碟掛載在 /mnt 當中了,那使用底下的方式來處理即可:

[root@study ~]# yum install /mnt/Packages/perl-5.*.rpm
>  /mnt/Packages/perl-Date-Manip-*.rpm \
>  /mnt/Packages/perl-Sys-CPU-*.rpm \
>  /mnt/Packages/perl-Sys-MemInfo-*.rpm \
>  /mnt/Packages/logwatch-*.rpm
# 得要安裝數個軟體才能夠順利的安裝好 logwatch 喔!當然,如果你有網路,直接安裝就好了!

[root@study ~]# ll /etc/cron.daily/0logwatch
-rwxr-xr-x. 1 root root 434 Jun 10  2014 /etc/cron.daily/0logwatch

[root@study ~]# /etc/cron.daily/0logwatch

安裝完畢以後,logwatch 就已經寫入 cron 的運作當中了!詳細的執行方式你可以參考上表中 0logwatch 檔案內容來處理,未來則每天會送出一封 email 給 root 查閱就是了。因為我們剛剛安裝,那可以來分析一下嗎?很簡單啦!你就直接執行 0logwatch 即可啊!如上表最後一個指令的示意。因為鳥哥的測試機目前的服務很少, 所以產生的資訊量也不多,因此執行的速度很快。比較忙的系統資訊量比較大,分析過程會花去一小段時間。如果順利執行完畢,那請用 root 的身份去讀一下 email 囉!

[root@study ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 5 messages 2 new 4 unread
>N  4 root                  Thu Jul 30 19:35  29/763   "testing at job"
 N  5 logwatch@study.cento  Thu Aug 20 17:55  97/3045  "Logwatch for study.centos.vbird (Linux)"
& 5
Message  5:
From root@study.centos.vbird  Thu Aug 20 17:55:23 2015
Return-Path: <root@study.centos.vbird>
X-Original-To: root
Delivered-To: root@study.centos.vbird
To: root@study.centos.vbird
From: logwatch@study.centos.vbird
Subject: Logwatch for study.centos.vbird (Linux)
Auto-Submitted: auto-generated
Precedence: bulk
Content-Type: text/plain; charset="iso-8859-1"
Date: Thu, 20 Aug 2015 17:55:23 +0800 (CST)
Status: R

# logwatch 會先說明分析的時間與 logwatch 版本等等資訊
 ################### Logwatch 7.4.0 (03/01/11) ####################
        Processing Initiated: Thu Aug 20 17:55:23 2015
        Date Range Processed: yesterday
                              ( 2015-Aug-19 )
                              Period is day.
        Detail Level of Output: 0
        Type of Output/Format: mail / text
        Logfiles for Host: study.centos.vbird
 ##################################################################

# 開始一項一項的資料進行分析!分析得很有道理啊!
 --------------------- pam_unix Begin ------------------------
 su-l:
    Sessions Opened:
       dmtsai -> root: 2 Time(s)
 ---------------------- pam_unix End -------------------------

 --------------------- Postfix Begin ------------------------
      894   Bytes accepted                                 894
      894   Bytes delivered                                894
 ========   ==================================================
        2   Accepted                                   100.00%
 --------   --------------------------------------------------
        2   Total                                      100.00%
 ========   ==================================================
        2   Removed from queue
        2   Delivered
 ---------------------- Postfix End -------------------------

 --------------------- SSHD Begin ------------------------
 Users logging in through sshd:
    dmtsai:
       192.168.1.200: 2 times
 Received disconnect:
    11: disconnected by user : 1 Time(s)
 ---------------------- SSHD End -------------------------

 --------------------- Sudo (secure-log) Begin ------------------------
 dmtsai => root
 --------------
 /bin/su                        -   2 Time(s).
 ---------------------- Sudo (secure-log) End -------------------------

# 當然也得說明一下目前系統的磁碟使用狀態喔!
 --------------------- Disk Space Begin ------------------------
 Filesystem                 Size  Used Avail Use% Mounted on
 /dev/mapper/centos-root     10G  3.7G  6.3G  37% /
 devtmpfs                   1.4G     0  1.4G   0% /dev
 /dev/vda2                 1014M  141M  874M  14% /boot
 /dev/vda4                 1014M   33M  982M   4% /srv/myproject
 /dev/mapper/centos-home    5.0G  642M  4.4G  13% /home
 /dev/mapper/raidvg-raidlv  1.5G   33M  1.5G   3% /srv/raidlvm
 ---------------------- Disk Space End -------------------------

由於鳥哥的測試用主機尚未啟動許多服務,所以分析的項目很少。若你的系統已經啟動許多服務的話, 那麼分析的項目理應會多很多才對。

18.5.2 鳥哥自己寫的登錄檔分析工具:

雖然已經有了類似 logwatch 的工具,但是鳥哥自己想要分析的資料畢竟與對方不同~所以囉,鳥哥就自己寫了一支小程式 (shell script 的語法) 用來分析自己的登錄檔,這支程式分析的登錄檔主要由 journalctl 所產生,而且只會抓前一天的登錄檔來分析而已~ 若比對 rsyslog.service 所產生的登錄檔,則主要用到底下幾個對應的檔名 (雖然真的沒用到! ^_^):

  • /var/log/secure
  • /var/log/messages
  • /var/log/maillog

當然啦,還不只這些啦,包括各個主要常見的服務,如 pop3, mail, ftp, su 等會使用到 pam 的服務, 都可以透過鳥哥寫的這個小程式來分析與處理呢~整個資料還會輸出一些系統資訊。如果你想要使用這個程式的話, 歡迎下載:

安裝的方法也很簡單,你只要將上述的檔案在根目錄底下解壓縮,自然就會將 cron 排程與相對應的檔案放到正確的目錄去。 基本上鳥哥會用到的目錄有 /etc/cron.d 以及 /root/bin/logfile 而已!鳥哥已經寫了一個 crontab 在檔案中,設定每日 00:10 去分析一次系統登錄檔。 不過請注意,這次鳥哥使用的登錄檔真的是來自於 journalctl ,所以 CentOS 6 以前的版本千萬不要使用喔!現在假設我將下載的檔案放在跟目錄,所以:

[root@study ~]# tar -zxvf /logfile_centos7.tar.gz -C /
[root@study ~]# cat /etc/cron.d/vbirdlogfile
10 0 * * * root /bin/bash /root/bin/logfile/logfile.sh &> /dev/null

[root@study ~]# sh /root/bin/logfile/logfile.sh
# 開始嘗試分析系統的登錄檔,依據你的登錄檔大小,分析的時間不固定!

[root@study ~]# mail
# 自己找到剛剛輸出的結果,該結果的輸出有點像底下這樣:
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 9 messages 4 new 7 unread
 N  8 root                  Thu Aug 20 19:26  60/2653  "study.centos.vbird logfile analysis results"
>N  9 root                  Thu Aug 20 19:37  59/2612  "study.centos.vbird logfile analysis results"
& 9

# 先看看你的硬體與作業系統的相關情況,尤其是 partition 的使用量更需要隨時注意!
=============== system summary =================================
Linux kernel  :  Linux version 3.10.0-229.el7.x86_64 (builder@kbuilder.dev.centos.org)
CPU informatin:  2 Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
CPU speed     :  2299.996 MHz
hostname is   :  study.centos.vbird
Network IP    :  192.168.1.100 
Check time    :  2015/August/20 19:37:25 ( Thursday )
Summary date  :  Aug 20
Up times      :  3 days, 59 min,
Filesystem summary:
       Filesystem                Type      Size  Used Avail Use% Mounted on
       /dev/mapper/centos-root   xfs        10G  3.7G  6.3G  37% /
       devtmpfs                  devtmpfs  1.4G     0  1.4G   0% /dev
       tmpfs                     tmpfs     1.4G   48K  1.4G   1% /dev/shm
       tmpfs                     tmpfs     1.4G  8.7M  1.4G   1% /run
       tmpfs                     tmpfs     1.4G     0  1.4G   0% /sys/fs/cgroup
       /dev/vda2                 xfs      1014M  141M  874M  14% /boot
       /dev/vda4                 xfs      1014M   33M  982M   4% /srv/myproject
       /dev/mapper/centos-home   xfs       5.0G  642M  4.4G  13% /home
       /dev/mapper/raidvg-raidlv xfs       1.5G   33M  1.5G   3% /srv/raidlvm
       /dev/sr0                  iso9660   7.1G  7.1G     0 100% /mnt

# 這個程式會將針對 internet 與內部監聽的埠口分開來顯示!
================= Ports 的相關分析資訊 =======================
主機啟用的 port 與相關的 process owner:
對外部介面開放的 ports (PID|owner|command)
       tcp 21|(root)|/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
       tcp 22|(root)|/usr/sbin/sshd -D
       tcp 25|(root)|/usr/libexec/postfix/master -w
       tcp 222|(root)|/usr/sbin/sshd -f /etc/ssh/sshd2_config -D
       tcp 514|(root)|/usr/sbin/rsyslogd -n
       tcp 555|(root)|/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf

# 以下針對有啟動的服務個別進行分析!
================= SSH 的登錄檔資訊彙整 =======================
今日沒有使用 SSH 的紀錄

================= Postfix 的登錄檔資訊彙整 ===================
使用者信箱受信次數:

目前鳥哥都是透過這支程式去分析自己管理的主機,然後再據以瞭解系統狀況,如果有特殊狀況則即時進行系統處理! 而且鳥哥都是將上述的 email 調整成自己可以在 Internet 上面讀到的郵件,這樣我每天都可以收到正確的登錄檔分析資訊哩!

18.6 重點回顧

  • 登錄檔可以記錄一個事件的何時、何地、何人、何事等四大資訊,故系統有問題時務必查詢登錄檔;
  • 系統的登錄檔預設都集中放置到 /var/log/ 目錄內,其中又以 messages 記錄的資訊最多!
  • 登錄檔記錄的主要服務與程式為: systemd-journald.service, rsyslog.service, rsyslogd
  • rsyslogd 的設定檔在 /etc/rsyslog.conf ,內容語法為:『 服務名稱.等級 記載裝置或檔案』
  • 透過 linux 的 syslog 函數查詢,了解上述服務名稱有 kernel, user, mail...從 0 到 23 的服務序號
  • 承上,等級從不嚴重到嚴重依序有 info, notice, warning, error, critical, alert, emergency 等
  • rsyslogd 本身有提供登錄檔伺服器的功能,透過修改 /etc/rsyslog.conf 內容即可達成;
  • logrotate 程式利用 crontab 來進行登錄檔的輪替功能;
  • logrotate 的設定檔為 /etc/logrotate.conf ,而額外的設定則可寫入 /etc/logrotate.d/* 內;
  • 新的 CentOS 7 由於內建 systemd-journald.service 的功能,可以使用 journalctl 直接從記憶體讀出登錄檔,查詢效能較佳
  • logwatch 為 CentOS 7 預設提供的一個登錄檔分析軟體。

18.7 本章習題

( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
實作題:
  • 請在你的 CentOS 7.x 上面,依照鳥哥提供的 logfile.sh 去安裝,並將結果取出分析看看。


簡答題部分:
  • 如果你想要將 auth 這個服務的結果中,只要訊息等級高於 warn 就給予發送 email 到 root 的信箱,該如何處理?
    利用 vim 去編輯 /etc/rsyslog.conf 檔案,內容為
    auth.warn root
  • 啟動系統登錄資訊時,需要啟動哪兩個 daemon 呢?
    systemd-journald.service, rsyslog.service
  • rsyslogd 以及 logrotate 個別透過什麼機制來執行?
    rsyslogd 為 stand alone daemon 的機制; logrotate 則是透過 crontab 來執行的!只是個指令而已。
修改歷史:
  • 2002/06/24:第一次完成
  • 2003/02/11:重新編排與加入 FAQ
  • 2005/10/12:舊的文章已經被移動到 此處
  • 2005/10/24:終於寫完了~啊!怎麼寫這麼久??
  • 2006/07/23:修改了 /etc/logrotate.d/syslog 的設定資料
  • 2009/03/31:將舊的基於 FC4 版本的資料移動至 此處
  • 2009/09/14:加入了一些例題而已。這一篇太簡單了~想不到什麼好的題目說~
  • 2010/12/24:感謝網友 eujiang 提供的英文版 logfile.sh 程式喔!
  • 2015/08/14:將舊的基於 CentOS 5 的版本移動到 這裡,有需要的前往觀察!
  • 2016/11/23:依據討論區 eZioPan網友提供的建議,原本的 .! 以及相關說明有點錯誤,已經訂正! 感謝 eZioPan 兄!
2002/06/24以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計