systemd 之 journalctl


Systemd 日志系統

一、前言

昨天寫了一篇文章,內容為:Systemd 常規操作與彩蛋,參考了 ArchLinux 官方文檔並結合培訓中的思路進行了部分修改補充。如果你懂得了基礎的管理,那必然還需要做維護和審計。這時候就需要 Redhat7 中的systemd 架構下的——systemd-journald

下有倆例子對比 init.dsystemd

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-journaldrsyslog 兩服務組成

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 工程師的培訓,分享了 systemdjournalctl 的使用。

希望你可以喜歡。如果 ITer奮斗點滴 對您有所幫助,請通過贊賞鼓勵我堅持下去。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM