Linux 必知必會(huì):通過不同示例查看和分析 Systemd 日志
介紹
許多人說 Systemd 不好,它對(duì)系統(tǒng)很繁重,而且一直是一個(gè)有爭議的話題。但你不能否認(rèn)它提供了一套很好的實(shí)用程序來管理和排除系統(tǒng)故障。想象一下,您最終會(huì)得到一個(gè)沒有 GUI 的損壞系統(tǒng)。您可能也搞砸了 boot 和 GRUB。在這種情況下或一般情況下——您可以從 LIVE 系統(tǒng)啟動(dòng),掛載您的 Linux 分區(qū)并瀏覽 Systemd 日志以找出問題所在。
Systemd 具有以下三個(gè)基本組件:
- systemd:Linux 操作系統(tǒng)的系統(tǒng)和服務(wù)管理器。
- systemctl:用于自省和控制 systemd 系統(tǒng)和服務(wù)管理器狀態(tài)的命令。
- systemd-analyze:提供系統(tǒng)啟動(dòng)性能統(tǒng)計(jì)信息,并從系統(tǒng)和服務(wù)管理器檢索其他狀態(tài)和跟蹤信息
除了這三個(gè)之外,systemd 還提供了其他服務(wù),例如 – journald、logind、networkd 等。在本指南中,我們將討論 systemd 的 journald 服務(wù)。
journald – systemd journal守護(hù)進(jìn)程
通過設(shè)計(jì),systemd 提供了一種集中方式來處理來自進(jìn)程、應(yīng)用程序等的所有操作系統(tǒng)日志。所有這些日志記錄事件都由 systemd 的 journald 守護(hù)進(jìn)程處理。journald 守護(hù)進(jìn)程收集來自 Linux 操作系統(tǒng)各處的所有日志,并將主題作為二進(jìn)制數(shù)據(jù)存儲(chǔ)在文件中。
集中記錄事件的優(yōu)點(diǎn),作為二進(jìn)制數(shù)據(jù)的系統(tǒng)問題有很多。例如,由于系統(tǒng)日志存儲(chǔ)為二進(jìn)制而不是文本 - 您可以通過多種方式進(jìn)行翻譯,例如文本、JSON 對(duì)象以滿足各種需求。此外,由于日志是通過日志的日期/時(shí)間操作順序存儲(chǔ)的,因此跟蹤單個(gè)事件非常容易。
請(qǐng)記住,journald 收集的日志文件有數(shù)千行,并且會(huì)針對(duì)每個(gè)事件、每次啟動(dòng)進(jìn)行更新。因此,如果您長時(shí)間運(yùn)行 Linux 操作系統(tǒng),journal日志大小應(yīng)該以 GB 為單位。由于日志數(shù)以千計(jì),因此最好使用基本命令進(jìn)行過濾以了解有關(guān)系統(tǒng)問題的更多信息。
journald配置文件
journald 的配置文件位于以下路徑中。它包含有關(guān)日志記錄如何發(fā)生的各種標(biāo)志。您可以查看該文件并進(jìn)行必要的更改。但我建議不要修改此文件,除非您知道自己在做什么。
/etc/systemd/journald.conf
journald 存儲(chǔ)二進(jìn)制日志文件的位置
journald 以二進(jìn)制格式存儲(chǔ)日志。它們存儲(chǔ)在此路徑下的目錄中。
[linuxmi@fedora www.linuxmi.com]$ cd /var/log/journal
[linuxmi@fedora journal]$ ls
a73fa995d8e4438ea7b1fcedb8220981
[linuxmi@fedora journal]$ cd a73fa995d8e4438ea7b1fcedb8220981
例如,在下面的路徑中有一個(gè)目錄,其中包含迄今為止的所有系統(tǒng)日志。
journalctl 日志文件路徑
不要使用 cat 命令或使用 nano 或 vi 打開這些文件。它們將無法正確顯示。
使用 journalctl 查看和分析 Systemd 日志
基本journalctl命令
使用journalctl守護(hù)程序查看日志的基本命令是 :
[linuxmi@fedora www.linuxmi.com]$ journalctl
journalctl
這將為您提供所有日志條目,包括來自所有應(yīng)用程序和進(jìn)程的錯(cuò)誤、警告等。它顯示最舊日志在頂部和當(dāng)前日志在底部的列表。您需要按住 ENTER 逐行滾動(dòng)。您也可以使用 PAGE UP 和 PAGE DOWN 鍵滾動(dòng)。按 q 退出此視圖。
如何查看時(shí)區(qū)的 journal條目
默認(rèn)情況下,journalctl 顯示當(dāng)前系統(tǒng)時(shí)區(qū)的日志時(shí)間。但是,您可以輕松地在命令中提供時(shí)區(qū)以將相同的日志轉(zhuǎn)換為不同的時(shí)區(qū)。例如,要以 UTC 格式查看日志,請(qǐng)使用以下命令。
[linuxmi@fedora www.linuxmi.com]$ journalctl --utc
journalctl –utc
如何在journal日志中僅查看錯(cuò)誤、警告等
系統(tǒng)生成的日志具有不同的優(yōu)先級(jí)。有些日志可能是可以忽略的警告,有些可能是嚴(yán)重錯(cuò)誤。您可能只想查看錯(cuò)誤,而不是警告。這也可以使用以下命令。
要查看緊急系統(tǒng)消息,請(qǐng)使用:
[linuxmi@fedora www.linuxmi.com]$ journalctl -p 0
journalctl -p 0
錯(cuò)誤代碼
0:緊急
1:警報(bào)
2:嚴(yán)重
3:錯(cuò)誤
4:警告
5:通知
6:信息
7:調(diào)試
當(dāng)您指定錯(cuò)誤代碼時(shí),它會(huì)顯示來自該代碼及以上代碼的所有消息。例如,如果您指定以下命令,它將顯示優(yōu)先級(jí)為 2、1 和 0 的所有消息
[linuxmi@fedora www.linuxmi.com]$ journalctl -p 2
如何查看特定引導(dǎo)的 journal日志
當(dāng)您運(yùn)行 journalctl 命令時(shí),它會(huì)顯示來自當(dāng)前啟動(dòng)的信息,這些信息來自您正在運(yùn)行的當(dāng)前會(huì)話。但也可以查看有關(guān)過去引導(dǎo)的信息。
journal 日志會(huì)在每次重新啟動(dòng)時(shí)不斷更新。journald 跟蹤不同引導(dǎo)中的日志。要查看,引導(dǎo)日志使用以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --list-boots
journalctl 列表引導(dǎo)
- 第一個(gè)數(shù)字顯示了唯一的日志引導(dǎo)軌道編號(hào),您可以在下一個(gè)命令中使用它來分析特定的引導(dǎo)。
- 第二個(gè)數(shù)字是您也可以在命令中指定的引導(dǎo) ID。
- 接下來的兩個(gè)日期、時(shí)間組合是存儲(chǔ)在相應(yīng)文件中的日志的持續(xù)時(shí)間。如果您想從特定日期、時(shí)間找出日志或錯(cuò)誤,這非常方便。
要查看特定的引導(dǎo)編號(hào),請(qǐng)使用第一個(gè)編號(hào)或引導(dǎo) ID,如下所示。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -b -2
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -b ff83b9f3b8cb462abf6f0c318c86f4a2
journalctl -b 2
您還可以使用-x開關(guān)來在顯示中添加對(duì) systemd 錯(cuò)誤消息的解釋。在某些情況下,這是救命稻草。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -xb -p 3
journalctl -xb
如何查看特定時(shí)間、日期持續(xù)時(shí)間的 journal 日志
journalctl 足夠強(qiáng)大,可以在命令本身中提供類似“english”的參數(shù)來進(jìn)行時(shí)間和日期操作。
您可以將 --since 開關(guān)與“yesterday”, “today”, “tomorrow”, 或 “now”組合使用。
下面是不同命令的一些示例。您可以根據(jù)需要修改它們。一看就知道,以下命令中的日期、時(shí)間格式為"YYYY-MM-DD HH:MM:SS"
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since "2022-01-16 06:00:00"
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since "2022-03-03" --until "2022-03-05 05:00:00"
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since yesterday
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl --since 08:00 --until "1 hour ago"
您也可以將上述內(nèi)容與錯(cuò)誤級(jí)別開關(guān)結(jié)合使用。
如何查看內(nèi)核特定的journal 日志
Linux 內(nèi)核消息也可以從 journal 日志中提取。要查看當(dāng)前啟動(dòng)的內(nèi)核消息,請(qǐng)僅使用以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -k
如何查看服務(wù)的 journal 日志,PID
您只能從 journald 日志中過濾掉來自 systemd 服務(wù)單元的特定日志。例如,要從 NetworkManager 服務(wù)中查找日志,請(qǐng)使用以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl -u NetworkManager.service
journalctl NetworkManager 服務(wù)
如果您不知道服務(wù)名稱,可以使用以下命令列出系統(tǒng)中的 systemd 服務(wù)。
linuxmi@linuxmi:~/www.linuxmi.com$ systemctl list-units --type=service
如何查看用戶、組的 journal 日志
如果您正在分析服務(wù)器日志,則此命令在多個(gè)用戶登錄時(shí)很有幫助。您可以首先使用以下命令從用戶名中找出用戶 ID。例如,要找出用戶“ linuxmi”的 id
linuxmi@linuxmi:~/www.linuxmi.com$ id -u linuxmi
然后使用該 ID 和_UID來查看用戶生成的日志。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl _UID=1000 --since today
journalctl _UID
同樣,使用_GID為用戶組找出相同的值。
如何查看可執(zhí)行文件的 journal 日志
您還可以查找特定程序或可執(zhí)行文件的 journald記錄。例如,如果要查找 gnome-shell 的消息,可以運(yùn)行以下命令。
linuxmi@linuxmi:~/www.linuxmi.com$ journalctl /usr/bin/gnome-shell --since today
journalctl gnome-shell
結(jié)束語
我希望本指南可以幫助您使用 journalctl 在 Linux 桌面或服務(wù)器故障排除上查看分析 systemd 日志。如果您知道如何使用命令,systemd 日志管理功能非常強(qiáng)大,它可以讓您在調(diào)試期間輕松一些。如今,所有主要的主流 Linux 發(fā)行版都使用 Systemd。Ubuntu、Debian、Fedora、Arch——它們都使用 systemd 作為默認(rèn)操作系統(tǒng)產(chǎn)品。如果您想了解無 systemd 的 Linux 發(fā)行版,那你可能需要查看MX-Linux、Gentoo、Slackware、Void Linux。