什么是登錄檔
【詳細而確實的分析以及備份系統的登錄文件】是一個系統管理員應該要進行的任務之一。
登錄檔 就是記錄系統活動信息的幾個文件,例如:何時、何地(來源IP)、何人(什么服務名稱)、做了什么動作(訊息登錄啰)。
換句話說就是:記錄系統在什么時候由哪個程序做了什么樣的行為時,發生了何種的事件等等。
CentOS 7 登錄檔簡易說明
Linux 主機在背景之下有相當多的 daemons 同時在工作著,這些工作中的程序總是會顯示一些訊息,這些顯示的訊息最終會被記載到登錄文件當中。也就是說,記錄這些系統的重要訊息就是登錄文件的工作。
登錄檔的重要性
1.解決系統方面的錯誤:
系統可能會出現一些錯誤,包括硬件捉不到或者是某些系統服務無法順利運作的情況。由于系統會將硬件偵測過程記錄在登錄文件內,只要透過查詢登錄文件就能夠了解系統出了什么問題。
2.解決網絡服務的問題:
由于網絡服務的各種問題通常都會被寫入特別的登錄檔,只要查詢登錄檔就會知道出了什么差錯,例如如果無法啟動郵件服務器(postfix),那么查詢一下/var/log/maillog 通常可以得到不錯的解答。
3.過往事件記錄簿:
WWW服務(httpd 軟件)在某個時刻流量特別大,要了解為什么時,可以透過登錄檔去找出該時段是哪些IP在聯機與查詢的網頁數據為何,就能夠知道原因。
透過(1)察看屏幕上面的錯誤訊息與(2)登錄文件的錯誤信息,幾乎可以解決大部分的 Linux問題。
Linux 常見的登錄檔檔名
登錄文件可以幫助我們了解很多系統重要的事件,包括登入者的部分信息,因此登錄文件的權限通常是設定為僅有 root 能夠讀取而已。
常見的幾個登錄檔有下面幾個:
/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/loglfaillog:
這兩個文件可以記錄正確登入系統者的帳戶信息 (wtmp)與錯誤登入時所使用的帳戶信息 (faillog);
/var/log/httpd/*, /var/log/samba/*:
不同的網絡服務會使用它們自己的登錄文件來記載它們自己產生的各項訊息,上述的目錄內則是個別服務所制訂的登錄檔。
不同的Linux distributions ,通常登錄檔的檔名不會相同(除了/var/log/messages 之外 )。
登錄檔所需相關服務(daemon)與程序
登錄檔的產生基本上有兩種方式:一種是由軟件開發商自行定義寫入的登錄檔與相關格式,例如 WWW軟件 apache 就是這樣處理的。另一種則是由 Linux distribution 提供的登錄檔管理服務來統一管理。只要將訊息丟給這個服務后,他就會自己分門別類的將各種訊息放置到相關的登錄檔去。CentOS 提供 rsyslog.service 這個服務來統一管理登錄檔。
不過要注意的是,如果任憑登錄文件持續記錄的話,由于系統產生的信息天天都有,那么登錄文件的容量將會持續增長,如果登錄文件容量太大時,可能會導致大文件讀寫效率不佳的問題(因為要從磁盤讀入內存,越大的文件消耗內存量越多)。所以需要對登錄檔備份與更新。
可以透過 logrotate(登錄檔輪替)來自動化處理登錄文件容量與更新的問題。
所謂的 logrotate 基本上,就是將舊的登錄檔更改名稱,然后建立一個空的登錄檔,如此一來,新的登錄文件將重新開始記錄,然后只要將舊的登錄檔留下一陣子就可以達到將登錄檔【輪轉】的目的。
此外,如果舊的記錄(大概要保存幾個月吧!)保存了一段時間沒有問題,那么就可以讓系統自動的將他砍掉,免得占掉很多寶貴的硬盤空間。
總結一下,針對登錄文件所需的功能,需要的服務與程序有:
systemd-journald.service:最主要的訊息收受者,由systemd提供的;
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 簡易很多。
登錄檔內容的一般格式
一般來說,系統產生的訊息經過記錄下來的數據中,每條訊息均會記錄幾個重要數據:
事件發生的日期與時間;
發生此事件的主機名;
啟動此事件的服務名稱(如 systemd, CROND等)或指令與函式名稱(如su, login…);
該訊息的實際數據內容。
這些信息的【詳細度】是可以修改的,而且,這些信息可以作為系統除錯之用。
發生底下幾種情況時:
當你覺得系統似乎不太正常時;
某個 daemon 老是無法正常啟動時;
某個使用者老是無法登入時;
某個 daemon 執行過程老是不順暢時;
要去【巡視】登錄檔的內容。
rsyslog.service:記錄登錄文件的服務
Linux 的登錄檔主要是由 rsyslog.service 在負責,查看其是否自啟動:
rsyslog.service 的配置文件:/etc/rsyslog.conf
rsyslogd 可以負責主機產生的各個信息的登錄,而這些信息本身是有【嚴重等級】之分的。
基本上,rsyslogd 針對各種服務與訊息記錄在某些文件的配置文件就是 /etc/rsyslog.conf,這個文件規定了【(1)什么服務(2)的什么等級訊息3需要被記錄在哪里(裝置或文件)】,所以設定的語法會是這樣:
服務名稱
rsyslogd 主要是透過Linux核心提供的 syslog 相關規范來設定數據的分類的,Linux 的 syslog 本身有規范一些服務訊息,可以透過這些服務來儲存系統的訊息。Linux核心的 syslog 認識的服務類型主要有底下這些:(可使用man 3 syslog 查詢到相關的信息,或查詢 syslog.h這個文件來了解)
Linux 核心的 syslog 函數自行制訂的服務名稱,軟件開發商可以透過呼叫上述的服務名稱來記錄他們的軟件。
舉例來說, sendmail 與 postfix 及 dovecot 都是與郵件有關的軟件,這些軟件在設計登錄文件記錄時,都會主動呼叫 syslog 內的 mail 服務名稱(LOG_MAIL)。所以上述三個軟件(sendmail, postfix, dovecot)產生的訊息在 syslog 看起來,就會是 【mail】類型的服務了。
另外,每種服務所產生的數據量其實差異是很大的,舉例來說,mail 的登錄文件訊息很多,每一封信件進入后, mail 至少需要記錄【寄信人的信息;與收信者的訊息】等等;而如果是用來做為工作站主機的,那么登入者(利用login登錄主機處理事情)的數量一定不少,那個authpriv所管轄的內容就很多了。
訊息等級
同一個服務所產生的訊息也是有差別的,有啟動時僅通知系統而已的一般訊息(information),有出現還不至于影響到正常運作的警告訊息 (warn),還有系統硬件發生嚴重錯誤時,所產生的重大問題訊息 (error 等等);訊基本上,Linux核心的 syslog 將訊息分為七個主要的等級,根據syslog.h 的定義,訊息名稱與數值的對應如下:
基本上,在0(emerg)到6(info)的等級之間,等級數值越高代表越沒事,等級靠近0則代表事情大了。
除了 0 到 6 之外還有兩個比較特殊的等級,那就是debug(錯誤偵測等級)與none(不需登錄等級)兩個,當我們想要作一些錯誤偵測,或者是忽略掉某些服務的信息時,就用這兩個。
特別留意一下在訊息等級之前還有【=!】的鏈接符號。他代表的意思是:
.
:代表【比后面還要嚴重的等級(含該等級)都被記錄下來】的意思,例如: mail.info 代表只要是 mail
的信息,而且該信息等級嚴重于info (含 info本身)時,就會被記錄下來的意思。
.=
:代表所需要的等級就是后面接的等級而已,其他的不要。
.!
:代表不等于,亦即是除了該等級外的其他等級都記錄。
一般來說,比較常使用的是【.
】這個鏈接符號。
訊息記錄的文件名或裝置或主機
一些常見的放置處:
文件的絕對路徑:通常就是放在 /var/log 里頭的文件;
打印機或其他:例如/dev/lp0 這個打印機裝置;
使用者名稱:顯示給用戶;
遠程主機:例如@study.vbird.tsai 要對方主機也能支持才行;
*
:代表【目前在在線的所有人】,類似 wall 這個指令的意義。
服務、daemon 與函數名稱
CentOs 7.x 預設的 rsyslog.conf 內容
vim /etc/rsyslog.conf
#kern.*:只要是核心產生的訊息,全部都送到 console(終端機)去。console通常是由外部裝置連接到系統而來。這個項目通常應該是用在系統出現嚴重問題而無法使用默認的屏幕觀察系統時,可以透過這個項目來連接取得核心的訊息。
*.info;mail.none;authpriv.none;cron.none:由于 mail, authpriv, cron等類別產生的訊息較多,且已經寫入底下的數個文件中,因此在 /var/log/messages 里面就不記錄這些項目。除此之外的其他訊息都寫入
/var/log/messages 中。
authpriv.*:認證方面的訊息均寫入 /var/log/secure 文件;
mail.*:郵件方面的訊息則均寫入 /var/log/maillog 文件;
cron.*:例行性工作排程均寫入/var/log/cron文件;
*.emerg:當產生最嚴重的錯誤等級時,將該等級的訊息以 wall 的方式廣播給所有在系統登入的賬號得知,要這么做的原因是希望在線的用戶能夠趕緊通知系統管理員來處理這么可怕的錯誤問題。
uucp,news.crit: ucp 是早期 Unix-like 系統進行數據傳遞的通訊協議,后來常用在新聞組的用途中。news則是新聞組。當新聞組方面的信息有嚴重錯誤時就寫入 /var/log/spooler 文件中;
local7.*:將本機開機時應該顯示到屏幕的訊息寫入到 /var/log/boot.log 文件中;
登錄檔的安全性檢查
可以透過一個隱藏的屬性來設定登錄檔,成為【只可以增加數據,但是不能被刪除】的狀態。
chatt r +a /var/1og/ admin.log
加入了這個屬性之后,/var/log/admin.log 登錄檔從此就僅能被增加,而不能被刪除,直到 root 以 【chattr -a /var/log/admin.log
】 取消這個 a 的參數之后,才能被刪除或移動。
登錄檔服務器的設定
登錄檔服務器的架構:
如上圖所示,服務器會啟動監聽的埠口,客戶端則將登錄檔再轉出一份送到服務器去。而既然是登錄檔【服務器】,所以當然有服務器與客戶端(client)。兩者的設定分別是這樣的:
1.Server 端:修改 rsyslogd 的啟動配置文件,在 /etc/rsyslog.conf 內
上面的是UDP埠口,底下的是TCP埠口。如果網絡狀態很穩定,就用UDP即可。不過,如果想要讓數據比較穩定傳輸,那么建議使用TCP。
2.client 端:指定某個信息傳送到這部主機即可
可以在 /etc/rsyslog.conf 內新增一行:TCP:*.* @@192.168.1.100
,UDP:*.* @192.168.1.100
重新啟動 rsyslog.service 后就OK。。。。
登錄檔的輪替
【rsyslogd 利用的是 daemon 的方式來啟動的,當有需求的時候立刻就會被執行的,但是 logrotate 卻是在規定的時間到了之后才來進行登錄檔的輪替,所以這個logrotate 程序是掛在cron底下進行的】
logrotate
logrotate主要是針對登錄檔來進行輪替的動作,記載了【在什么狀態下才將登錄檔進行輪替】的設定。
logrotate這個程序的參數配置文件在:/etc/logrotate.conf
、/etc/logrotate.d/
logrotate.conf 才是主要的參數文件,至于 logrotate.d 是一個目錄,該目錄里面的所有文件都會被主動的讀入 /etc/logrotate.conf 當中來進行。另外,在 /etc/logrotate.d 里面的文件中,如果沒有規定到的一些細部設定,則以 /etc/logrotate.conf 這個文件的規定來指定為默認值。
logrotate 的主要功能就是將舊的登錄文件移動成舊檔,并且重新建立一個新的空的文件來記錄,他的執行結果類似底下的圖示:
當第一次執行完 rotate 之后,原本的 messages 會變成 messages.1 而且會制造一個空的 messages 給系統來儲存登錄文件。而第二次執行之后,則 messages.1 會變成 messages.2 而 messages 會變成messages.1,又造成一個空的 messages 來儲存登錄檔。
如果僅設定保留三個登錄檔而已的話,那么執行第四次時,則messages.3這個文件就會被刪除,并由后面的較新的保存登錄檔所取代。
vim /etc/logrotate.conf
可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄。
如果獨立出來一個目錄,那么每個以 RPM 打包方式所建立的服務的登錄檔輪替設定,就可以獨自成為一個文件,并且放置到 /etc/logrotate.d/ 當中即可。
一般來說,這個 /etc/logrotate.conf 是【預設的輪替狀態】而已,各個服務都可以擁有自己的登錄檔輪替設定,也可以自行修改成自己喜歡的樣式。
logrotate.conf 的設定語法是:
/etc/logrotate.d/syslog 這個輪替 rsyslog.service服務的文件:
在上面的語法當中,正確的 logrotate 的寫法為:
檔名:被處理的登錄文件絕對路徑文件名寫在前面,可以使用空格符分隔多個登錄檔;
參數:上述檔名進行輪替的參數使用 {}
包括起來;
執行腳本:可呼叫外部指令來進行額外的命令下達,這個設定需與 sharedscripts …endscript 設定合用才行。至于可用的環境為:
1.prerotate:在啟動 logrotate 之前進行的指令,例如修改登錄文件的屬性等動作;
2.postrotate:在做完 logrotate之后啟動的指令,例如重新啟動(kill -HUP)某個服務;/bin/kill -HUP… 的目的在于將系統的 rsyslogd 重新以其參數檔(rsyslog.conf)的資料讀入一次;
3.Prerotate 與 postrotate對于已加上特殊屬性的文件處理上面,是相當重要的執行程序;
那么、/etc/logrotate.d/syslog 內設定的 5 個文件的輪替功能就變成了:
該設定只對 /var/log/ 內的 cron, maillog, messages, secure, spooler 有效;
登錄檔輪替每周一次、保留四個、且輪替下來的登錄檔不進行壓縮(未更改默認值);
輪替完畢后(postrotate)取得 syslog 的 PID 后,以 kill -HUP 重新啟動 syslogd。
實際測試 logrotate 的動作
logrotate [-vf] logfile;
由于 logrotate 的工作已經加入 crontab 里了,所以現在每天系統都會自動的給他查看 logrotate。
systemd-journald.service 簡介
過去只有 rsyslogd 的年代中,由于 rsyslogd 必須要開機完成并且執行了 rsyslogd 這個daemon之后,登錄文件才會開始記錄。所以,核心還得要自己產生一個 klogd 的服務,才能將系統在開機過程、啟動服務的過程中的信息記錄下來,然后等 rsyslogd 啟動后才傳送給它來處理。
systemd 是核心喚醒的,然后又是第一支執行的軟件,它可以主動呼叫 systemd-journald 來協助記載登錄文件。因此在開機過程中的所有信息,包括啟動服務與服務若啟動失敗的情況等等,都可以直接被記錄到systemd-journald里。
不過 systemd-journald 由于是使用于內存的登錄文件記錄方式,因此重新啟動過后,開機前的登錄文件信息就不會被記載了。
雖然 systemd-journald 所記錄的數據其實是在內存中,但是系統還是利用文件的型態將它記錄到 /run/log/ 底下。不過 /run 在 CentOS 7 其實是內存內的數據,所以重新啟動過后,這個/run/log 底下的數據就被刷新,舊的就不再存在了。
使用 journalctl 觀察登錄信息
journalctl [-nrpf] [--since TIME] [--until TIME] _optional
logger 指令的應用
logger [-p 服務名稱,等級] "訊息"
手動使用 logger 來傳送數據到登錄文檔內:
保存 journal 的方式
systemd-journald.servicd 的訊息是不會放到下一次開機后的,所以,重新啟動后,那之前的記錄通通會遺失。
基本上,systemd-journald.service 的配置文件主要參考 /etc/systemd/journald.conf 的內容。
只是如果想要保存 journalctl 所讀取的登錄檔那么就得要建立一個 /var/log/journal 的目錄,并且處理一下該目錄的權限,那么未來重新啟動systemd-journald.service 之后,日志登錄文件就會主動的復制一份到/var/log/journal目錄下了。
1.先處理所需要的目錄與相關權限設定;
2.重新啟動 systemd- journald 并且觀察備份的日志數據。
logwatch 為 CentOS 7 預設提供的一個登錄文件分析軟件。
《鳥哥的Linux私房菜-基礎篇》學習筆記