Systemd 日志系統
一、前言
昨天寫了一篇文章,內容為:Systemd 常規操作與彩蛋,參考了 ArchLinux
官方文檔並結合培訓中的思路進行了部分修改補充。如果你懂得了基礎的管理,那必然還需要做維護和審計。這時候就需要 Redhat7
中的systemd
架構下的——systemd-journald。
下有倆例子對比 init.d
和 systemd
:
service daemon ---> rsyslog ---> /var/log
systemd --> systemd-journald --> ram DB --> rsyslog -> /var/log
**當 systemd
啟動后,systemd-journald
也會立即啟動。將日志存入RAM中,當rsyslog
啟動后會讀取該RAM並完成篩選分類寫入目錄 /var/log
。所以牽扯到DB,操作就會很舒服。 **
二、基礎知識
描述RHEL7的基本系統日志(syslog)架構
- 進程和操作系統內核需能夠為發生的事件記錄日志
- 日志內容可用於系統審計和故障排除
- 默認日志存儲在
/var/log
目錄中 - RHEL的日志系統基於
syslog
協議,許多程序使用此系統記錄事件,並將齊整理到日志
文件中 - RHEL7的日志系統由
systemd-journald
和rsyslog
兩服務組成
systemd-journald和rsyslog:
- 一種改進的日志管理服務,是
syslog
的補充,收集來自內核、啟動過程早期階段、標
准輸出、系統日志,守護進程啟動和運行期間錯誤的信息 - 將消息寫入到結構化的事件日志中(數據庫),默認情況下重啟后刪除
syslog
的信息也可以由systemd-journald
轉發到rsyslog
中進一步處理- 默認情況下,
systemd
的日志保存在/run/log/journal
中,系統重啟就會清除,這是RHEL7的新特性。通過新建/var/log/journal
目錄,日志會自動記錄到這個目錄中,並永久存儲。 rsyslog
服務隨后根據優先級排列日志信息,將它們寫入到/var/log
目錄中永久保存
三、常規操作
systemd
提供了自己的日志系統(logging system),稱為 journal
。使用 systemd
日志,無需額外安裝日志服務(syslog)。讀取日志的命令:
# journalctl
重要:顯示所有的日志信息,notice或warning以粗體顯示,紅色顯示error級別以上的信息
顯示最后行數的日志:
# journalctl -n
顯示最詳細信息:
# journalctl -f
提示:其實它很像tailf命令,默認顯示十行。隨着匹配日志的增長而持續輸出。
只顯示錯誤、沖突和重要告警信息
# journalctl -p err..alert
提示:也可以使用數字表示喲。
顯示指定單元的所有消息:
# journalctl -u netcfg
重要:一般 -u
參數是 systemctl status 調用的參數之一(journalctl -l 可查看所有)
提示:如果希望顯示 kernel
的信息需要使用 journalctl -k
進行內核環緩存消息查詢。
顯示從某個時間 ( 例如 20分鍾前 ) 的消息:
# journalctl --since "20 min ago"
# journalctl --since today
# journalctl --until YYYY-MM-DD
顯示本次啟動后的所有日志:
# journalctl -b
不過,一般大家更關心的不是本次啟動后的日志,而是上次啟動時的(例如,剛剛系統崩潰了)。可以使用 -b
參數:
journalctl -b -0
顯示本次啟動的信息journalctl -b -1
顯示上次啟動的信息journalctl -b -2
顯示上上次啟動的信息journalctl -b -2
只顯示錯誤、沖突和重要告警信息
顯示特定進程的所有消息:
# journalctl _PID=1
1. \_COMM 顯示特定程序的所有消息,例如:``journalctl /usr/lib/systemd/systemd``
2. \_EXE 進程的可執行文件的路徑
3. \_PID 進程的PID
4. \_UID 運行該進程用戶的UID
5. _SYSTEMD_UNIT 啟動該進程的 `systemd` 單元
提示:以上篩選條件可組合使用,例如:journalctl _SYSTEMD_UNIT=sshd.service _PID=1182
顯示更多輸出方案:
# journalctl -o short|short-iso|short-percise|short-monotonic|verbose|export|json|json-pretty|json-sse|cat
四、一些其他
Q:你說有RAM的DB文件,在哪里?
A:文件位於 /run/log/joutmal
,下附命令。
➜ ~ cd /run/log/journal
➜ journal ll
total 0
drwxr-s---+ 2 root systemd-journal 60 Aug 27 02:08 b30db55783924f1ea633ca636730d409
➜ b30db55783924f1ea633ca636730d409 cat system.journal
Q:那 joutnal
有配置文件嗎,有的話在哪呢?
A:有的。容量定義文件位於 /etc/systemd/journald.conf
,日志調整文件位於 /etc/logrotate.conf
。
日志系統同樣會進行輪轉,每月觸發。默認情況下,日志大小不能超過所處文件系統的10%,也不可使所處文件系統空間低於15%。在 /etc/systemd/journald.conf 可進行大小容量上的調節;而在 /etc/logrotate.conf 則定義了那些日志文件記錄、怎么記錄、記錄多少。
Q:那你說到了日志輪詢,在哪里實現呢?
A:在計划任務實現。
➜ ~ sudo cat /etc/cron.daily/logrotate
\#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
Q:在 journalctl -p
一節說可以使用數字表達,有詳細嗎?
A:如下。但是建議使用英文表達,因為不同發行版本可能編碼有不同,而英文是標准是通用。
編碼 | 優先級 | 嚴重性 |
---|---|---|
0 | emerg | 系統不可用 |
1 | alert | 必須立即采取措施 |
2 | crit | 嚴重狀況 |
3 | err | 非嚴重錯誤狀況 |
4 | warning | 警告狀況 |
5 | notice | 正常但重要的事件 |
6 | info | 信息性事件 |
7 | debug | 調試級別消息 |
五、結文總結
通過作者參加 RHCE 工程師的培訓,分享了 systemd
與 journalctl
的使用。
希望你可以喜歡。如果 ITer奮斗點滴 對您有所幫助,請通過贊賞鼓勵我堅持下去。