systemd
取代 SUSE Linux Enterprise 12 中的傳統 init 程序管理 (請參閱第 13 章 「systemd 使用」),引入了自身的記錄系統日誌。由於所有系統事件都將寫入到日誌中,因此,使用者不再需要執行基於 syslog
的服務。
日誌本身是 systemd
管理的系統服務,完整名稱為 systemd-journald.service
。它會根據從核心、使用者程序、標準輸入和系統服務錯誤收到的記錄資訊,維護結構化的索引記錄,藉以收集和儲存記錄資料。systemd-journald
服務預設處於開啟狀態。
# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static) Active: active (running) since Mon 2014-05-26 08:36:59 EDT; 3 days ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 413 (systemd-journal) Status: "Processing requests..." CGroup: /system.slice/systemd-journald.service └─413 /usr/lib/systemd/systemd-journald [...]
依預設,日誌在 /run/log/journal/
中儲存記錄資料。由於 /run/
目錄具有易失本性,因此,在重新開機時會遺失記錄資料。若要永久儲存記錄資料,/var/log/journal/
目錄必須存在且具有正確的擁有權和許可權,如此,systemd-journald 服務便可在其中儲存其資料。systemd
將為您建立該目錄,如果您執行以下操作,它將會切換到永久記錄︰
以
root
身分開啟/etc/systemd/journald.conf
進行編輯。# vi /etc/systemd/journald.conf
取消註解包含
Storage=
的行,並將它變更為[...] [Journal] Storage=persistent #Compress=yes [...]
儲存該檔案,然後重新啟動 systemd-journald︰
systemctl restart systemd-journald
本節介紹了一些可用來增強 journalctl
預設行為的常見有用選項。journalctl
手冊頁 man 1 journalctl
中介紹了所有參數。
提示:與特定可執行檔相關的訊息
若要顯示與特定可執行檔相關的所有日誌訊息,請指定該可執行檔的完整路徑︰
journalctl /usr/lib/systemd/systemd
-f:只顯示最近的日誌訊息,另外,在將新的記錄項目新增到日誌時會列印這些新項目。
-e:列印訊息並跳轉到日誌末尾,以便在頁面巡覽區中顯示最新的項目。
-r:以反向順序列印記錄訊息,使最新的項目列在最前面。
-k:只顯示核心訊息。這等同於欄位比對 _TRANSPORT=kernel
(請參閱第 15.3.3 節 「依據欄位過濾」)。
-u:只顯示指定 systemd
單元的訊息。這等同於欄位比對 _SYSTEMD_UNIT=UNIT
(請參閱第 15.3.3 節 「依據欄位過濾」)。
# journalctl -u apache2 [...] Jun 03 10:07:11 pinkiepie systemd[1]: Starting The Apache Webserver... Jun 03 10:07:12 pinkiepie systemd[1]: Started The Apache Webserver.
如果不結合任何參數呼叫 journalctl
,它將顯示日誌的完整內容,最舊的項目列在最前面。可按特定的參數和欄位過濾輸出。
journalctl
可以依據特定的系統開機編號過濾訊息。若要列出所有可用的開機,請執行
# journalctl --list-boots -1 097ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT 0 156019a44a774a0bb0148a92df4af81b Fri 2014-05-30 05:34:09 EDT—Fri 2014-05-30 06:15:01 EDT
第一欄列出開機偏移︰0
表示目前的開機,-1
表示上一次開機,-2
表示再上一次的開機,依此類推。第二欄包含開機 ID,其後是特定開機的限制時間戳記。
顯示目前開機中的所有訊息︰
如果需要查看上一次開機的記錄訊息,請新增一個偏移參數。下面的範例將輸出上一次開機的訊息︰
另一種方法是依據開機 ID 列出開機訊息。要實現此目的,請使用 _BOOT_ID 欄位︰
# journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b
可透過指定開始日期和 / 或結束日期來過濾 journalctl
的輸出。日期規格應採用「2014-06-30 9:17:16」這樣的格式。如果省略時間部分,則會假設為午夜。如果省略秒,則會假設為「:00」。如果省略日期部分,則會假設為目前日期。您也可以不採用數字表示法,而是指定關鍵字「yesterday」、「today」或「tomorrow」。它們表示當日前一天、當日或者當日後一天的午夜。如果指定「now」,則表示目前時間。您還可以指定以 -
或 +
為字首的相對時間,分別表示目前時間之前或之後的特定時間。
僅顯示從現在開始產生的新訊息,並持續更新輸出︰
# journalctl --since "now" -f
顯示從昨天午夜到 3:20AM 的所有訊息︰
# journalctl --since "today" --until "3:20"
您可以按特定的欄位過濾日誌輸出。要比對的欄位語法為 FIELD_NAME=MATCHED_VALUE
,例如 _SYSTEMD_UNIT=httpd.service
。您可以在單個查詢中指定多個比對條件,以更精確地過濾輸出訊息。如需預設欄位的清單,請參閱 man 7 systemd.journal-fields
。
顯示特定程序 ID 產生的訊息︰
顯示屬於特定使用者 ID 的訊息︰
顯示來自核心環緩衝區的訊息 (與 dmesg
產生的結果相同)︰
# journalctl _TRANSPORT=kernel
顯示來自服務之標準輸出或錯誤輸出的訊息︰
# journalctl _TRANSPORT=stdout
僅顯示指定服務產生的訊息︰
# journalctl _SYSTEMD_UNIT=avahi-daemon.service
如果指定了兩個不同的欄位,則僅顯示同時與兩個運算式相符的項目︰
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488
如果兩個比對參考了同一個欄位,則顯示與兩個運算式中任意一個相符的所有項目︰
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
可以使用「+」分隔符將兩個運算式組合成一個邏輯「OR」。下面的範例將顯示來自程序 ID 為 1480 之 Avahi 服務程序的所有訊息,以及來自 D-Bus 服務的所有訊息︰
# journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service
本節將介紹一個簡單的範例,說明如何找出並修復 systemd
在 apache2
啟動期間報告的錯誤。
嘗試啟動 apache2 服務︰
# systemctl start apache2 Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
我們來看看該服務的狀態如何︰
# systemctl status apache2 apache2.service - The Apache Webserver Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled) Active: failed (Result: exit-code) since Tue 2014-06-03 11:08:13 CEST; 7min ago Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND \ -k graceful-stop (code=exited, status=1/FAILURE)
導致錯誤的程序 ID 為 11026。
顯示與程序 ID 11026 相關的詳細訊息︰
# journalctl -o verbose _PID=11026 [...] MESSAGE=AH00526: Syntax error on line 6 of /etc/apache2/default-server.conf: [...] MESSAGE=Invalid command 'DocumenttRoot', perhaps misspelled or defined by a module [...]
改正
/etc/apache2/default-server.conf
中的錯字,啟動 apache2 服務,然後列印其狀態︰# systemctl start apache2 && systemctl status apache2
apache2.service - The Apache Webserver Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled) Active: active (running) since Tue 2014-06-03 11:26:24 CEST; 4ms ago Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND -k graceful-stop (code=exited, status=1/FAILURE) Main PID: 11263 (httpd2-prefork) Status: "Processing requests..." CGroup: /system.slice/apache2.service ├─11263 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...] ├─11280 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...] ├─11281 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...] ├─11282 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...] ├─11283 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...] └─11285 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
可透過修改 /etc/systemd/journald.conf
來調整 systemd-journald 服務的行為。本節只介紹基本的選項設定。如需完整的檔案描述,請參閱 man 5 journald.conf
。請注意,若要使變更生效,必須使用以下指令重新啟動日誌
# systemctl restart systemd-journald
如果將日誌記錄資料儲存到永久位置 (請參閱第 15.1 節 「將日誌設為永久」),這些資料最多可佔用 /var/log/journal
所在檔案系統空間的 10%。例如,如果 /var/log/journal
位於一個 30 GB 的 /var
分割區中,則日誌最多可佔用 3 GB 磁碟空間。若要變更此限制,請變更 (並取消註解) SystemMaxUse
選項︰
您可以將日誌轉遞到終端機裝置,以便在偏好的終端機螢幕 (例如 /dev/tty12
) 上顯式相關的系統訊息。將以下 journald 選項變更為
ForwardToConsole=yes TTYPath=/dev/tty12
Journald 與傳統的 syslog 實作 (例如 rsyslog
) 回溯相容。請務必滿足以下條件︰
已安裝 rsyslog。
# rpm -q rsyslog rsyslog-7.4.8-2.16.x86_64
已啟用 rsyslog 服務。
# systemctl is-enabled rsyslog enabled ForwardToSyslog=yes
已在
/etc/systemd/journald.conf
中啟用轉遞至 syslog。
当启动service失败或者出现异常时,我们同行需要查看systemd的日志。 journalctl就是最常用的查看systemd日志的工具了。
systemd本身使用 systemd-journald.service
来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/
目录中.
ls -R /var/log/journal/ /var/log/journal/: c291481e2d9b4024b6315308254f29df remote /var/log/journal/c291481e2d9b4024b6315308254f29df: system@b06763dfb5d9474bbf08a41aafa705db-0000000000000001-00054f69725bd1f4.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000000b4fb-000551d6d83e3bec.journal system@b06763dfb5d9474bbf08a41aafa705db-0000000000011330-00055283e814ebff.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000001f0f2-000554ef5835cba3.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000001f26f-000554ef5d159c4d.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000002e434-0005575684e0156a.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000002e59d-0005575694a45c89.journal system@b06763dfb5d9474bbf08a41aafa705db-0000000000041f7f-000559d3e2618783.journal system@b06763dfb5d9474bbf08a41aafa705db-00000000000420e3-000559d411759d7a.journal system@b06763dfb5d9474bbf08a41aafa705db-0000000000053108-00055c3ebcc97ddd.journal system@b06763dfb5d9474bbf08a41aafa705db-0000000000053268-00055c3ecdad6b24.journal system@b06763dfb5d9474bbf08a41aafa705db-0000000000060b5e-00055ea67129b27f.journal system@b06763dfb5d9474bbf08a41aafa705db-0000000000060cc2-00055ea750da7423.journal system@b06763dfb5d9474bbf08a41aafa705db-00000000000705c2-0005610bae10254c.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000007f115-000563724facc0ec.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000007f2a6-00056372622f1fb9.journal system@b06763dfb5d9474bbf08a41aafa705db-0000000000089e54-000565e109b67bae.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000008a147-000565e11109f819.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000009d3f5-00056846b7b72568.journal system@b06763dfb5d9474bbf08a41aafa705db-000000000009d6ef-00056846b9dfdae2.journal system@b06763dfb5d9474bbf08a41aafa705db-00000000000bee0f-00056a81e6471243.journal system@b06763dfb5d9474bbf08a41aafa705db-00000000000d7e23-00056cea54ac049d.journal system@b06763dfb5d9474bbf08a41aafa705db-00000000000d7fca-00056cea9d641931.journal system@b06763dfb5d9474bbf08a41aafa705db-00000000000f2885-00056f63127cbe97.journal system@b06763dfb5d9474bbf08a41aafa705db-00000000000f2af8-00056f63149c60b5.journal system.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-00000000000015b0-00055006ed5dfbb6.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-000000000001132e-00055283e8135caf.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-000000000001f26d-000554ef5d14f66e.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-000000000002e59b-0005575694a3b831.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-00000000000420e1-000559d41174fbf8.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-0000000000053266-00055c3ecdacd823.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-0000000000060cc0-00055ea750d9d71f.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-00000000000705cb-0005610bbd3f532d.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-000000000007f2a4-00056372622da099.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-000000000008a145-000565e11108ed20.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-000000000009d6ed-00056846b9ddd3d4.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-00000000000bfd2c-00056a8255f67694.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-00000000000d7fc8-00056cea9d631972.journal user-1000@1f9ca3ee21814314a67d9069a58e7128-00000000000f2af6-00056f63149a9d60.journal user-1000.journal /var/log/journal/remote:
systemd之所以使用二进制来存储日志是因为systemd除了记录日志本身外,还会记录大量的元数据。 这些信息可以方便用户对信息进行过滤和分类,但同时也占用了大量的空间。 有鉴于此,systemd使用二进制格式以节省空间。
journalctl --output=verbose --all | head -n 32 -- Logs begin at Sat 2017-05-13 23:26:32 HKT, end at Wed 2018-08-08 15:38:56 HKT. -- Sat 2017-05-13 23:26:32.333812 HKT [s=b06763dfb5d9474bbf08a41aafa705db;i=1;b=3d88f970ddc247a8bc58bbcf924fb9c5;m=2796ef;t=54f69725bd1f4;x=c397f8de2fb56e8e] SYSLOG_FACILITY=3 SYSLOG_IDENTIFIER=systemd-journald _TRANSPORT=driver PRIORITY=6 MESSAGE=Time spent on flushing to /var is 943us for 0 entries. _PID=180 _UID=0 _GID=0 _COMM=systemd-journal _EXE=/usr/lib/systemd/systemd-journald _CMDLINE=/usr/lib/systemd/systemd-journald _CAP_EFFECTIVE=25402800cf _SYSTEMD_CGROUP=/system.slice/systemd-journald.service _SYSTEMD_UNIT=systemd-journald.service _SYSTEMD_SLICE=system.slice _SYSTEMD_INVOCATION_ID=028ad00d541f43b18015d87a4b504133 _BOOT_ID=3d88f970ddc247a8bc58bbcf924fb9c5 _MACHINE_ID=c291481e2d9b4024b6315308254f29df _HOSTNAME=T520 Sat 2017-05-13 23:26:32.333966 HKT [s=b06763dfb5d9474bbf08a41aafa705db;i=2;b=3d88f970ddc247a8bc58bbcf924fb9c5;m=279788;t=54f69725bd28e;x=ed81c61ce14af023] _BOOT_ID=3d88f970ddc247a8bc58bbcf924fb9c5 _MACHINE_ID=c291481e2d9b4024b6315308254f29df _HOSTNAME=T520 _SOURCE_MONOTONIC_TIMESTAMP=0 _TRANSPORT=kernel PRIORITY=5 SYSLOG_FACILITY=0 SYSLOG_IDENTIFIER=kernel MESSAGE=Linux version 4.10.13-1-ARCH (builduser@tobias) (gcc version 6.3.1 20170306 (GCC) ) #1 SMP PREEMPT Thu Apr 27 12:15:09 CEST 2017 Sat 2017-05-13 23:26:32.334011 HKT [s=b06763dfb5d9474bbf08a41aafa705db;i=3;b=3d88f970ddc247a8bc58bbcf924fb9c5;m=2797b6;t=54f69725bd2bb;x=e5ad63c3bd76a8fa]
你会看到除了 MESSAGE
这一项是真正的日志消息外,还有大量的其他元数据,比如 SYSLOG_FACILIT
, _PID
, _UID
等等信息. 此外,你还会发现不同MESSAGE中元数据的数量也是不同的。
配置systemd-journald.service
systemd-journald
的配置文件为 /etc/systemd/journald.conf
中, 通过修改其中的配置信息可以影响其行为:
017-05-13 23:26:32 HKT, end at Wed 2018-08-08 16:27:01 HKT. -- 5月 13 23:26:32 T520 systemd-journald[180]: Time spent on flushing to /var is 943us for 0 entries. 5月 13 23:26:32 T520 kernel: Linux version 4.10.13-1-ARCH (builduser@tobias) (gcc version 6.3.1 20170306 (GCC) ) #1 SMP PREEMPT Thu Apr 27 12:15:09 CEST 2017 5月 13 23:26:32 T520 kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-linux root=UUID=a3e3ff49-bb3d-4610-a898-c623d9ff4b2b rw quiet 5月 13 23:26:32 T520 kernel: Disabled fast string operations 5月 13 23:26:32 T520 kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' 5月 13 23:26:32 T520 kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' 5月 13 23:26:32 T520 kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' 5月 13 23:26:32 T520 kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 5月 13 23:26:32 T520 kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
但这是没有必要的,我们可以使用 --since
和 --until
来指定显示某个时间段内的日志。
比如下面命令显示从 2018年8月1日开始的所有日志
journalctl --since "2018-08-01 00:00:00" | head -- Logs begin at Sat 2017-05-13 23:26:32 HKT, end at Wed 2018-08-08 20:41:31 HKT. -- 8月 01 10:05:31 T520 kernel: microcode: microcode updated early to revision 0x2d, date = 2018-02-07 8月 01 10:05:31 T520 kernel: Linux version 4.17.9-1-ARCH (builduser@heftig-26261) (gcc version 8.1.1 20180531 (GCC)) #1 SMP PREEMPT Sun Jul 22 20:23:36 UTC 2018 8月 01 10:05:31 T520 kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-linux root=UUID=a3e3ff49-bb3d-4610-a898-c623d9ff4b2b rw quiet 8月 01 10:05:31 T520 kernel: KERNEL supported cpus: 8月 01 10:05:31 T520 kernel: Intel GenuineIntel 8月 01 10:05:31 T520 kernel: AMD AuthenticAMD 8月 01 10:05:31 T520 kernel: Centaur CentaurHauls 8月 01 10:05:31 T520 kernel: Disabled fast string operations 8月 01 10:05:31 T520 kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
下面命令显示从 2018年7月30日9:30开始到2018年8月1日凌晨结束的所有日志
journalctl --since "2018-07-30 09:30:00" --until "2018-08-01 00:00:00" | head -- Logs begin at Sat 2017-05-13 23:26:32 HKT, end at Wed 2018-08-08 20:41:31 HKT. -- 7月 30 11:43:53 T520 kernel: microcode: microcode updated early to revision 0x2d, date = 2018-02-07 7月 30 11:43:53 T520 kernel: Linux version 4.17.9-1-ARCH (builduser@heftig-26261) (gcc version 8.1.1 20180531 (GCC)) #1 SMP PREEMPT Sun Jul 22 20:23:36 UTC 2018 7月 30 11:43:53 T520 kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-linux root=UUID=a3e3ff49-bb3d-4610-a898-c623d9ff4b2b rw quiet 7月 30 11:43:53 T520 kernel: KERNEL supported cpus: 7月 30 11:43:53 T520 kernel: Intel GenuineIntel 7月 30 11:43:53 T520 kernel: AMD AuthenticAMD 7月 30 11:43:53 T520 kernel: Centaur CentaurHauls 7月 30 11:43:53 T520 kernel: Disabled fast string operations 7月 30 11:43:53 T520 kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
还有一种常见的情况是,若想查看本次启动后发生的日志,可以使用 --boot
参数
journalctl --boot | tail 8月 08 20:22:06 T520 sshd[6092]: pam_tally(sshd:auth): pam_get_uid; no such user 8月 08 20:22:06 T520 sshd[6092]: pam_unix(sshd:auth): check pass; user unknown 8月 08 20:22:08 T520 sshd[6092]: Failed password for invalid user admin from 5.188.10.156 port 37215 ssh2 8月 08 20:22:08 T520 sshd[6092]: pam_tally(sshd:auth): pam_get_uid; no such user 8月 08 20:22:08 T520 sshd[6092]: pam_unix(sshd:auth): check pass; user unknown 8月 08 20:22:10 T520 sshd[6092]: Failed password for invalid user admin from 5.188.10.156 port 37215 ssh2 8月 08 20:22:10 T520 sshd[6092]: Connection closed by invalid user admin 5.188.10.156 port 37215 [preauth] 8月 08 20:22:10 T520 sshd[6092]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=5.188.10.156 8月 08 20:41:31 T520 sshd[7195]: Received disconnect from 50.115.166.112 port 42538:11: Bye Bye [preauth] 8月 08 20:41:31 T520 sshd[7195]: Disconnected from 50.115.166.112 port 42538 [preauth]
约束日志输出的行数
若我们只是想查看日志中的最后几行,没有必要使用tail命令,通过 --lines
命令即可,比如上面那个命令可以写成
journalctl --boot --lines=10 -- Logs begin at Sat 2017-05-13 23:26:32 HKT, end at Wed 2018-08-08 20:41:31 HKT. -- 8月 08 20:22:06 T520 sshd[6092]: pam_tally(sshd:auth): pam_get_uid; no such user 8月 08 20:22:06 T520 sshd[6092]: pam_unix(sshd:auth): check pass; user unknown 8月 08 20:22:08 T520 sshd[6092]: Failed password for invalid user admin from 5.188.10.156 port 37215 ssh2 8月 08 20:22:08 T520 sshd[6092]: pam_tally(sshd:auth): pam_get_uid; no such user 8月 08 20:22:08 T520 sshd[6092]: pam_unix(sshd:auth): check pass; user unknown 8月 08 20:22:10 T520 sshd[6092]: Failed password for invalid user admin from 5.188.10.156 port 37215 ssh2 8月 08 20:22:10 T520 sshd[6092]: Connection closed by invalid user admin 5.188.10.156 port 37215 [preauth] 8月 08 20:22:10 T520 sshd[6092]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=5.188.10.156 8月 08 20:41:31 T520 sshd[7195]: Received disconnect from 50.115.166.112 port 42538:11: Bye Bye [preauth] 8月 08 20:41:31 T520 sshd[7195]: Disconnected from 50.115.166.112 port 42538 [preauth]
指定日志级别
Linux的日志级别通常分成8个级别,从高到底分别为:
Code | Priority | Serverity |
---|---|---|
0 | Emerge | 系统不可用 |
1 | Alert | 必须立即采取行动 |
2 | Crit | 紧急情况 |
3 | Err | 非紧急的错误 |
4 | Warnning | 警告 |
5 | Notice | 普通但值得注意的事件 |
6 | Info | 信息 |
7 | Debug | 调试 |
我们可以通过 -p
选项来指定想要查看的日志级别,比如
journalctl -p err --lines=10
根据日志元数据进行过滤
前面提到了,systemd-journald写入的日志中包含了大量的元数据,我们可以通过这些元数据对日志信息进行过滤。
journalctl [options] [MATCHES...]
其中 MATCHES
的格式为 FIELD=VALUE
表示只有日志元数据域的值为指定值的日志才显示出来。
比如,我们想查看本次启动后 systemd-journald
本身产生的日志,可以这么看
journalctl --boot "_EXE=/usr/lib/systemd/systemd-journald" -- Logs begin at Sat 2017-05-13 23:26:32 HKT, end at Thu 2018-08-09 18:46:13 HKT. -- 8月 09 14:36:32 T520 systemd-journald[225]: Journal started 8月 09 14:36:32 T520 systemd-journald[225]: Runtime journal (/run/log/journal/c291481e2d9b4024b6315308254f29df) is 8.0M, max 186.2M, 178.2M free. 8月 09 14:36:32 T520 systemd-journald[225]: Time spent on flushing to /var is 809.869ms for 725 entries. 8月 09 14:36:32 T520 systemd-journald[225]: System journal (/var/log/journal/c291481e2d9b4024b6315308254f29df) is 1.1G, max 3.9G, 2.7G free.
既然是复数的 MATCHES
那么自然表示可以接多个 FIELD=VALUE
对了,这些 FIELD=VALUE
的组合规则为:
如果有多个 不同 的字段被 [MATCHES…] 参数匹配,那么这些字段之间使用”AND”逻辑连接,即所有域都满足的日志才会被输出
如果 同一个 字段被多个 [MATCHES…] 参数匹配, 那么这些匹配条件之间使用”OR”逻辑连接,也就是对于同一个字段,日志项只需满足任意一个匹配条件即可输出。
”+” 字符可用作 [MATCHES…]组之间的分隔符,并被视为使用”OR”逻辑连接。 也就是,MATCHE1 MATCHE2 + MATCHE3 MATCHE4 MATCHE5 + MATCHE6 MATCHE7 相当于 ( MATCHE1 MATCHE2 ) OR ( MATCHE3 MATCHE4 MATCHE5 ) OR ( MATCHE6 MATCHE7 )
除了直接通过 FIELD=VALUE
来过滤日志外, journalctl 也为一些常用的过滤域准备了专门的参数,比如:
-u / ==unit=${UNIT}|${PATTERN}
显示名为UNIT或匹配PATTERN模式的单元日志,相当于 _SYSTEMD_UNIT=${UNIT}
–user-unit=${USER}
显示特定用户会话单元的日志,相当于 _SYSTEMD_USER_UNIT=${USER}
和 _UID=${USER}
-p / –prioprity=${LEVEL}
根据日志级别过滤输出结果,相当于 PRIORITY=${LEVEL}
根据正则表达式搜索的日志
通过 ~–grep=”REGEXP”~ 可以过滤匹配正则表达式的日志内容,比如我想查看日志中所有与wifi相关的内容,那么可以
journalctl --boot --grep="wifi"
-- Logs begin at Sat 2017-05-13 23:26:32 HKT, end at Thu 2018-08-09 19:09:54 HKT. -- 8月 09 14:36:32 T520 systemd[1]: /etc/systemd/system/netctl@wlp3s0\x2daWiFi.service:1: .include directives are deprecated, and support for them will be removed in a future version of systemd. Please use drop-in files instead. 8月 09 14:36:33 T520 kernel: Intel(R) Wireless WiFi driver for Linux 8月 09 14:36:33 T520 kernel: iwlwifi 0000:03:00.0: can't disable ASPM; OS doesn't have ASPM control 8月 09 14:36:33 T520 kernel: iwlwifi 0000:03:00.0: loaded firmware version 18.168.6.1 op_mode iwldvm 8月 09 14:36:33 T520 kernel: iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEBUG enabled 8月 09 14:36:33 T520 kernel: iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEBUGFS enabled 8月 09 14:36:33 T520 kernel: iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEVICE_TRACING enabled 8月 09 14:36:33 T520 kernel: iwlwifi 0000:03:00.0: Detected Intel(R) Centrino(R) Advanced-N 6205 AGN, REV=0xB0 8月 09 14:36:34 T520 systemd[1]: Starting Automatically generated profile by wifi-menu... 8月 09 14:36:34 T520 netctl-auto[424]: Included profile 'wlp3s0-bWiFi' 8月 09 14:36:34 T520 netctl-auto[424]: Included profile 'wlp3s0-aWiFi' 8月 09 14:36:34 T520 network[421]: Starting network profile 'wlp3s0-aWiFi'... 8月 09 14:36:35 T520 kernel: iwlwifi 0000:03:00.0 wlp3s0: renamed from wlan0 8月 09 14:36:35 T520 kernel: iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 8月 09 14:36:35 T520 kernel: iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 8月 09 14:36:51 T520 network[421]: Failed to bring the network up for profile 'wlp3s0-aWiFi' 8月 09 14:36:51 T520 systemd[1]: netctl@wlp3s0\x2daWiFi.service: Main process exited, code=exited, status=1/FAILURE 8月 09 14:36:51 T520 systemd[1]: netctl@wlp3s0\x2daWiFi.service: Failed with result 'exit-code'. 8月 09 14:36:51 T520 systemd[1]: Failed to start Automatically generated profile by wifi-menu. 8月 09 15:09:58 T520 sudo[2730]: lujun9972 : TTY=pts/0 ; PWD=/home/lujun9972 ; USER=root ; COMMAND=/usr/bin/wifi-menu 8月 09 15:09:58 T520 kernel: iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 8月 09 15:09:58 T520 kernel: iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 8月 09 15:10:07 T520 systemd[1]: Starting Automatically generated profile by wifi-menu... 8月 09 15:10:07 T520 network[2810]: Starting network profile 'wlp3s0-aWiFi'... 8月 09 15:10:07 T520 kernel: iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 8月 09 15:10:07 T520 kernel: iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 8月 09 15:10:11 T520 systemd[1]: Started Automatically generated profile by wifi-menu. 8月 09 15:10:16 T520 network[2810]: Started network profile 'wlp3s0-aWiFi'
从输出中你会发现当用全小写的 wifi
来搜索时, WiFi
也会被匹配上,也就是不区分大小写, 而若是搜索的内容中有一个大些字母,则搜索会变成大小写敏感的,这一点跟Emacs中的搜索很类似
journalctl --boot --grep="Wifi"
-- Logs begin at Sat 2017-05-13 23:26:32 HKT, end at Thu 2018-08-09 19:09:54 HKT. --
-- No entries --
其他参数
除了上面提到的这些选项外,还有一些比较常用的选项,列举在此:
-f / –follow
只显示最新的日志项,并且不断显示新生成的日志项
-x / –catalog
在日志的输出中增加一些解释性的短文本, 以帮助进一步说明日志的含义、 问题的解决方案、支持论坛、开发文档等内容
–pager-end
转载自: