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