Linux 系統(tǒng)日志初學(xué)者指南
幾十年來(lái),Linux 日志記錄一直由 syslogd 守護(hù)進(jìn)程管理(注意 rsyslogd 是 syslogd 的新版本,是一個(gè)東西)。
Syslogd 將收集系統(tǒng)進(jìn)程和應(yīng)用程序發(fā)送到 /dev/log 的日志消息。然后它將消息定向到 /var/log/ 目錄中適當(dāng)?shù)募兾谋救罩疚募?/p>
Syslogd會(huì)知道將消息發(fā)送到哪里,因?yàn)槊織l消息都包括包含元數(shù)據(jù)字段(包括時(shí)間戳、消息來(lái)源和優(yōu)先級(jí))的標(biāo)頭。
除了 Syslogd 外, Linux 日志記錄現(xiàn)在也由 journald 紀(jì)錄,這個(gè)以后再介紹。
使用 syslogd 進(jìn)行日志記錄
syslogd 系統(tǒng)上的事件生成的所有日志都添加到 /var/log/syslog 文件中。但是,根據(jù)它們的標(biāo)識(shí)特征,它們也可能被發(fā)送到同一目錄中的一個(gè)或多個(gè)其他文件。
在 syslogd 中,消息的分發(fā)方式由位于 /etc/rsyslog.d/ 目錄中的 50-default.conf 文件的內(nèi)容決定。
下面這個(gè) 50-default.conf 的例子表示 cron 相關(guān)的日志信息將被寫入 cron.log 文件。星號(hào)(*)告訴 syslogd 發(fā)送具有任何優(yōu)先級(jí)的條目(而不是像 emerg 或 err 這樣的單一級(jí)別):
cron.* /var/log/cron.log
處理 syslogd 日志文件不需要任何特殊工具,例如 journalctl。但是如果你想在這方面做得很好,你需要知道每個(gè)標(biāo)準(zhǔn)日志文件中保存了什么樣的信息。
下表列出了最常見(jiàn)的 syslogd 日志文件和他們所紀(jì)錄的信息。
文件名內(nèi)容auth.log系統(tǒng)認(rèn)證和安全事件boot.log啟動(dòng)相關(guān)事件的記錄dmesg與設(shè)備驅(qū)動(dòng)程序相關(guān)的內(nèi)核環(huán)緩沖區(qū)事件dpkg.log軟件包管理事件kern.logLinux 內(nèi)核事件syslog所有日志的集合wtmp跟蹤用戶會(huì)話(通過(guò) who 和 last 命令訪問(wèn))
此外,個(gè)別應(yīng)用程序有時(shí)會(huì)寫入自己的日志文件。您還會(huì)經(jīng)常看到為接收應(yīng)用程序數(shù)據(jù)而創(chuàng)建的完整目錄,如 /var/log/supervisor/ 或 /var/log/mysql/。
除了您之前看到的 * 符號(hào)(適用于所有優(yōu)先級(jí))之外,還可以通過(guò)八個(gè)優(yōu)先級(jí)中的任何一個(gè)來(lái)控制日志重定向的文件路徑。
等級(jí)描述debug有助于調(diào)試info信息性notice正常情況warn需要警告的情況err錯(cuò)誤情況crit危急情況alert警報(bào),需要立即采取行動(dòng)emerg系統(tǒng)無(wú)法使用
使用 sysglogd 管理日志文件
默認(rèn)情況下,syslogd 在后臺(tái)處理日志輪換、壓縮和刪除,無(wú)需您提供任何操作。但是你應(yīng)該知道它是如何完成的,以防你有需要特殊處理的日志。
如果您的日志必須留存較長(zhǎng)時(shí)間,那么您肯定想知道如何通過(guò)關(guān)鍵文件找到自己需要的內(nèi)容。
要查看logrotate系統(tǒng)的運(yùn)行情況,列出 /var/log/ 目錄的一些內(nèi)容。例如,auth.log 文件以三種不同的格式出現(xiàn):
- auth.log- 目前處于活動(dòng)狀態(tài)的版本,新的授權(quán)信息被寫入其中。
- auth.log.1-最近一次被輪換掉的文件。它以未壓縮的格式保存,以便在必要時(shí)更容易快速調(diào)用它。
- auth.log.2.gz- 已壓縮以節(jié)省空間的較舊的日志文件(如下圖中的.gz擴(kuò)展名的文件)。
7天后,下一次輪換日期到來(lái)時(shí),auth.log.2.gz會(huì)更名為auth.log.3.gz,auth.log.1會(huì)被壓縮并更名為auth.log.2.gz,auth.log將變?yōu)?auth.log.1,并且將創(chuàng)建一個(gè)新文件并命名為 auth.log。
默認(rèn)日志輪換周期在 /etc/logrotate.conf 文件中控制。下面配置中所示的值表示在一周后輪換文件,并在四周后刪除舊文件。
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# packages drop log rotation information into this directory
include /etc/logrotate.
/etc/logrotate.d/ 目錄還包含自定義配置文件,用于管理單個(gè)服務(wù)或應(yīng)用程序的日志輪換。列出該目錄的內(nèi)容,您會(huì)看到以下配置文件:
$ ls /etc/logrotate.d/
apache2 apt dpkg mysql-server
rsyslog
samba
unattended-upgrade
您可以查看他們的內(nèi)容以了解他們對(duì)日志輪換的配置。
如何讀取系統(tǒng)日志文件
應(yīng)該完全避免使用 cat 。它只會(huì)在您的屏幕上顯示數(shù)千行內(nèi)容。
我建議使用 grep 過(guò)濾文件中的文本。
使用 tail -f 命令可以實(shí)時(shí)讀取當(dāng)前日志文件。您可以將其與 grep 結(jié)合使用以過(guò)濾所需的文本。
在某些情況下,您可能需要訪問(wèn)舊的壓縮日志。您可能總是先解壓文件,然后使用 grep、less 和其他命令來(lái)讀取其內(nèi)容,但是,有更好的選擇。有 zcat、zless 等 z 命令可讓您處理壓縮文件而無(wú)需先解壓它們。
一個(gè)日志分析的實(shí)例
這是一個(gè)示例,它將通過(guò) auth.log 文件搜索登錄嘗試失敗的證據(jù)。搜索單詞 failure 將返回包含短語(yǔ) authentication failure 的所有行
偶爾檢查一下可以幫助您發(fā)現(xiàn)通過(guò)猜測(cè)正確密碼來(lái)登錄你的Linux系統(tǒng)的企圖。管理員可能將密碼輸錯(cuò)一兩次,但太多次的密碼輸入錯(cuò)誤就需要警惕起來(lái):
$ cat /var/log/auth.log | grep 'authentication failure'
Sep 4 11:00:37 workstation sshd[2740141]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=121.46.19.30
Sep 4 11:00:38 workstation sshd[2740140]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=121.46.19.30 user=root
Sep 4 11:00:38 workstation sshd[2740148]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=121.46.19.30
如您所知,grep 為您完成了這項(xiàng)工作,但您從結(jié)果中只能看到身份驗(yàn)證失敗。要是能知道涉及誰(shuí)的帳戶會(huì)更有用。您可以通過(guò)告訴它包含匹配之前和之后的行來(lái)擴(kuò)展 grep 返回的結(jié)果。
此示例打印匹配及其之前和之后的1行。它告訴你有人使用帳戶 ubuntu 嘗試使用 su(切換用戶)登錄 root 帳戶失敗:
$ cat /var/log/auth.log | grep -C1 failure
Sep 4 22:43:43 hongdaokeji su: pam_unix(su:auth): Couldn't open /etc/securetty: No such file or directory
Sep 4 22:43:43 hongdaokeji su: pam_unix(su:auth): authentication failure; logname=ubuntu uid=1000 euid=0 tty=pts/2 ruser=ubuntu rhost= user=root
Sep 4 22:43:46 hongdaokeji su: FAILED SU (to root) ubuntu on pts/2