文檔說明
本文檔針對CentOS Linux release 7.2.1511 (Core)來進行操作系統日志的配置和分析,如使用的是其他版本,可能會存在一些差異。
系統日志說明
系統日志是記錄系統活動信息的文件, 記錄了:時間、地點 (IP)、用戶(或服務名稱)、做了哪些操作 等。 簡單的說,就是記錄系統在什么時候由哪個程序做了什么樣的行為時,發生了哪些事件。
可以依據操作系統的記錄解決系統方面的錯誤、解決網絡服務的問題,了解系統中歷史發生事件等。
日志在排查文件的時候至關重要,在Linux上一般跟系統相關的日志默認都會放到/var/log下面。
1.主要系統日志及其作用
1.1/var/log/boot.log
一般包含系統啟動時的日志,包括自啟動的服務。這個文件只會存儲本次開機啟動的信息,前次開機的信息並不會被保留下來。
可以看到此文件中存儲的是系統引導的相關信息,就是Linux開機自檢過程顯示的信息。
1.2/var/log/cron
記錄crontab自動任務相關信息。包括自動任務有沒有實際被執行,執行過程是否發生錯誤等。
1.3/var/log/dmesg
記錄系統在開機的時候核心偵測過程所產生的各項信息。由於 CentOS 默認將開機時核心的硬件偵測過程取消顯示, 因此額外將數據記錄一份在這個文件中。
1.4/var/log/lastlog
可以記錄系統上面所有的賬號最近一次登入系統時的相關信息。 該日志文件記錄最近成功登錄的事件和最后一次不成功的登錄事件,由login生成。 在每次用戶登錄時被查詢,該文件是二進制文件,需要使用 lastlog命令查看,根據UID排序顯示登錄名、端口號和上次登錄時間。如果某用戶從來沒有登錄過,就顯示為"**Never logged in**"。該命令只能以root權限執行。簡單地輸入lastlog命令后就會看到類似如下的信息:
系統賬戶諸如bin、daemon、adm、uucp、mail等決不應該登錄,如果發現這些賬戶已經登錄,就說明系統可能已經被入侵了。若發現記錄的時間不是用戶上次登錄的時間,則說明該用戶的賬戶已經泄密了。
1.5/var/log/maillog
該日志文件記錄了每一個發送到系統或從系統發出的電子郵件的活動。它可以用來查看用戶使用哪個系統發送工具或把數據發送到哪個系統。下面是該日志文件的片段。
其實主要是記錄 postfix (SMTP 協議提供者) 與 dovecot (POP3 協議提供者) 所產生的訊息。 SMTP 是發信所使用的通訊協議, POP3 則是收信使用的通訊協議。 postfix 與 dovecot 則分別是兩套達成通訊協議的軟件。
1.6/var/log/messages
包括整體系統信息,其中也包含系統啟動期間的日志。此外,mail,cron,daemon,kern和auth等內容也記錄在var/log/messages日志中。
IO 錯誤、網絡錯誤和其他系統錯誤都會記錄到這個文件中。其他信息,比如某個人的身份切換為 root,也在這里列出。如果服務正在運行,比如 DHCP 服務器,您可以在 messages 文件中觀察它的活動。通常,/var/log/messages 是您在做故障診斷時首先要查看的文件。
該 文件的格式是每一行包含日期、主機名、程序名,后面是包含PID或內核標識的方括 號、一個冒號和一個空格,最后是消息。該文件有一個不足,就是被記錄的入侵企圖和成功的入侵事件,被淹沒在大量的正常進程的記錄中。但該文件可以由 /etc/syslog文件進行定制。由 /etc/syslog.conf配置文件決定系統如何寫入/var/messages。有關如何配置/etc/syslog.conf文件決定系統日志 記錄的行為,將在后面詳細敘述。
1.7/var/log/secure
基本上,只要牽涉到『需要輸入賬號密碼』的軟件,那么當登入時 (不管登入正確或錯誤) 都會被記錄在此文件中。 包括系統的 login 程序、圖形接口登入所使用的 gdm 程序、 su, sudo 等程序、還有網絡聯機的ssh, telnet 等程序, 登入信息都會被記載在這里。
1.8/var/log/wtmp
該 日志文件永久記錄每個用戶登錄、注銷及系統的啟動、停機的事件。因此隨着系統正常 運行時間的增加,該文件的大小也會越來越大,增加的速度取決於系統用戶登錄的次數。該日志文件可以用來查看用戶的登錄記錄,last命令就通過訪問這個文 件獲得這些信息,並以反序從后向前顯示用戶的登錄記錄,last也能根據用戶、終端 tty或時間顯示相應的記錄。
命令last有兩個可選參數:
last -u 用戶名 顯示用戶上次登錄的情況。
last -t 天數 顯示指定天數之前的用戶登錄情況。
1.9/var/run/utmp
該 日志文件記錄有關當前登錄的每個用戶的信息。因此這個文件會隨着用戶登錄和注銷系 統而不斷變化,它只保留當時聯機的用戶記錄,不會為用戶保留永久的記錄。系統中需要查詢當前用戶狀態的程序,如 who、w、users、finger等就需要訪問這個文件。該日志文件並不能包括所有精確的信息,因為某些突發錯誤會終止用戶登錄會話,而系統沒有及時 更新 utmp記錄,因此該日志文件的記錄不是百分之百值得信賴的。
以 上提及的3個文件(/var/log/wtmp、/var/run/utmp、 /var/log/lastlog)是日志子系統的關鍵文件,都記錄了用戶登錄的情況。這些文件的所有記錄都包含了時間戳。這些文件是按二進制保存的,故 不能用less、cat之類的命令直接查看這些文件,而是需要使用相關命令通過這些文件而查看。其中,utmp和wtmp文件的數據結構是一樣的,而 lastlog文件則使用另外的數據結構,關於它們的具體的數據結構可以使用man命令查詢。
每 次有一個用戶登錄時,login程序在文件lastlog中查看用戶的UID。如果存在,則把用戶上次登錄、注銷時間和主機名寫到標准輸出中,然后 login程序在lastlog中記錄新的登錄時間,打開utmp文件並插入用戶的utmp記錄。該記錄一直用到用戶登錄退出時刪除。utmp文件被各種 命令使用,包括who、w、users和finger。
下一步,login程序打開文件wtmp附加用戶的utmp記錄。當用戶登錄退出時,具有更新時間戳的同一utmp記錄附加到文件中。wtmp文件被程序last使用。
1.10其他文件或者目錄
例如安裝系統自帶的一些軟件的時候,默認的日志輸出都是輸出到這個路徑下的,例如apache默認日志路徑/var/log/httpd/,這個是為了遵循系統設計的一些規范。
2.記錄日志文件的服務rsyslog.service
日志文件由rsyslog服務維護,所以需要保證已經啟動rsyslog,而且已經設定開機時啟動。
檢查rsyslog服務進程是否存在:
ps -elf | grep rsyslog
rsyslog進程存在。
檢查rsyslog服務是否已經開啟並設定為開機啟動:
systemctl status rsyslog
服務為啟動狀態,並且也已經預設為開機自動啟動。
2.1配置日志文件:/etc/rsyslog.conf
rsyslogd針對各種服務的哪些等級的信息記錄在哪些文件,是在/etc/rsyslog.conf中配置的。
下圖為/etc/rsyslog.conf配置文件的內容:
可以看到該文件內容的設定語法是這樣的:
服務名稱[.=!]信息等級 信息記錄的文件名或裝置或主機
例:上圖標紅的記錄可以解釋為cron服務的任何等級的信息記錄到/var/log/cron文件中。
服務名稱:
相對序號 |
服務類別 |
說明 |
0 |
kern(kernel) |
核心 (kernel) 產生的訊息,大部分都是硬件偵測以及核心功能的啟用; |
1 |
user |
在用戶層級所產生的信息,例如用戶使用 logger 指令來記錄登錄文件的功能; |
2 |
|
只要與郵件收發有關的訊息記錄都屬於這個; |
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 |
保留給本機用戶使用的一些登錄文件訊息,較常與終端機互動。 |
信息等級:
等級數值 |
等級名稱 |
說明 |
7 |
debug |
用來 debug (除錯) 時產生的訊息數據; |
6 |
info |
僅是一些基本的訊息說明而已; |
5 |
notice |
雖然是正常信息,但比 info 還需要被注意到的一些信息內容; |
4 |
warning |
(warn)警示的訊息,可能有問題,但是還不至於影響到某個 daemon 運作的信息;基本上, info,notice, warn 這三個訊息都是在告知一些基本信息而已,應該還不至於造成一些系統運作困擾; |
3 |
err |
(error)一些重大的錯誤訊息,例如配置文件的某些設定值造成該服務無法啟動的信息說明, 通常藉由 err 的錯誤告知,應該可以了解到該服務無法啟動的問題; |
2 |
crit |
比 error 還要嚴重的錯誤信息,這個 crit 是臨界點 (critical) 的縮寫,這個錯誤已經很嚴重了喔; |
1 |
alert |
警告警告,已經很有問題的等級,比 crit 還要嚴重; |
0 |
emerg |
(panic)等級,意指系統已經幾乎要宕機的狀態。 很嚴重的錯誤信息了。通常大概只有硬件出問題,導致整個核心無法順利運作,就會出現這樣的等級的訊息。 |
注意服務名稱和信息等級之間還有[.=!]的連接符號,具體含義如下:
. :代表比后面還要嚴重的等級 (含該等級) 都被記錄下來的意思,例如: mail.info 代表只要是 mail的信息,而且該信息等級嚴重於 info (含 info 本身)時,就會被記錄下來的意思。
.=:代表所需要的等級就是后面接的等級而已, 其他的不要;
.!:代表不等於, 即除了該等級外的其他等級都記錄。
一般來說,我們比較常使用的是『.』這個鏈接符號。
信息記錄的文件名或裝置或主機
信息要放置在哪。通常我們使用的都是記錄的文件。但是也可以輸出到裝置。也可以記錄到不同的主機上頭。具體有如下幾類:
文件的絕對路徑:通常就是放在 /var/log 里頭的文件;
打印機或其他:例如 /dev/lp0 這個打印機裝置;
使用者名稱:顯示給指定用戶;
遠程主機:例如 @study.vbird.tsai 當然,要對方主機也能支持才可以;
*:代表『目前在線的所有人』,類似 wall 這個指令的意義。
示例1:
我要將新聞組資料 (news) 及例行性工作排程 (cron) 的訊息都寫入到 /var/log/cronnews 的文件中,但是這兩個程序的警告訊息則額外的記錄在 /var/log/cronnews.warn 中, 那該如何設定我的 rsyslog.conf呢?
vim /etc/rsyslog.conf
添加如下內容即可
示例2:
messages 這個文件需要記錄所有的信息,但是就是不想要記錄 cron, mail 及 news 的信息,那么應該怎么寫?
vim /etc/rsyslog.conf
添加如下內容即可
使用『,』分隔時,那么等級只要接在最后一個即可,如果是以『;』來分的話, 那么就需要將服務與等級都寫上去。
2.2添加自定義記錄日志
例如想在/etc/rsyslog.conf文件中添加一行日志定義,將所有服務的info等級的日志記錄到/var/log/log_test.log文件
vi /etc/rsyslog.conf
添加如下內容:
*.info /var/log/log_test.log
保存該文件,然后重啟rsyslog服務的命令使修改生效。
systemctl restart rsyslog.service
使用logger工具測試配置是否成功。(logger是一個Shell命令接口,可以模擬產生各類rsyslog信息)
logger -p user.info "test info"
查看/var/log/log_test.log日志文件內容看是否有"test info"日志記錄,確認日志設置是否修改成功。
cat /var/log/log_test.log
可見已經配置成功。
3.日志文件輪轉
用日志輪轉服務logrotate來自動實現日志文件的定期清理。
CentOS7系統默認安裝有logrotate,logrotate的執行由crond服務實現。
檢查系統中是否安裝有logrotate
rpm -qa | grep logrotate
在/etc/cron.daily目錄中有一個名為logrotate的腳本文件用來啟動logrotate程序,以查看是否有任何日志需要輪轉。
輪轉配置文件為/etc/logrotate.conf的默認配置
logrotate的主要功能就是將舊的登錄文件移動成舊檔,並且重新建立一個新的空文件來記錄,它的執行結果有點類似底下的圖示:
由上面的圖示我們可以清楚的知道,當第一次執行完 rotate 之后,原本的 messages 會變成messages.1 而且會制造一個空的 messages 給系統來儲存日志文件。而第二次執行之后,則messages.1 會變成 messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存日志信息!那么如果我們僅設定保留三個登錄檔而已的話,那么執行第四次時,則 messages.3 這個文件就會被刪除,並由后面的較新的保存登錄檔所取代。
4.查看和分析系統日志條目
4.1日志條目示例
以我們自己添加的/var/log/log_test.log 為例:
日志文件記錄順序按時間順序排列,開頭顯示最早的消息,末尾顯示最新的消息。
4.2使用tail工具實時監控日志文件
通常使用tail工具來監控日志文件。它輸出指定文件的最后10行,並實時滾動顯示最新的日志記錄。
tail -f 日志文件
以/var/log/log_test.log 為例:
日志會實時滾動,按ctrl+c結束監控。
系統日志注意事項
注意:rsyslogd的日志文件只要被編輯過就無法繼續記錄。假如發現系統日志不能記錄信息了,那么很可能是因為使用“:wq”來離開vim的環境,所以才會導致不能記錄的問題。
解決方式為:重新啟動rsyslog.service讓它繼續提供服務。