journalctl工具基礎介紹
Systemd 統一管理所有 Unit 的啟動日誌。帶來的好處就是 ,可以只用journalctl一個命令,查看所有日誌(內核日誌和 應用日誌)。日誌的配置文件/etc/systemd/journald.conf
journalctl用法
查看所有日誌(默認情況下 ,只保存本次啟動的日誌)
journalctl
查看內核日誌(不顯示應用日誌)
journalctl -k
查看系統本次啟動的日誌
journalctl -b
查看上一次啟動的日誌(需更改設置)
在該[Journal]部分下,將該Storage=選項設置為“persistent”以啟用持久記錄: vim /etc/systemd/journald.conf . . . [Journal] Storage=persistent
在您的服務器上啟用了保存以前的引導時,journalctl提供了一些命令來幫助您將引導作為分割單位來使用。要查看journald知道的引導,請使用以下--list-boots選項journalctl:
[root@centos7 ~]# journalctl --list-boots -1 00d066e11cb3412a912cb804cee123b5 Thu 2018-02-22 17:01:47 CST—Thu 2018-02-22 17:09:15 CST 0 63f75abbe94c4087bc2cc3cdb3b57100 Thu 2018-02-22 17:09:10 CST—Thu 2018-02-22 17:10:19 CST
這將為每次啟動顯示一行。第一列是啟動的偏移量,可用於輕松引用啟動journalctl。如果您需要絕對參考,則啟動ID位於第二列。您可以通過在結束時列出的兩個時間規範來指出引導會話引用的時間。
要顯示來自這些引導的信息,您可以使用來自第一列或第二列的信息。
例如,要查看上一次啟動的日誌,請使用-1帶有該-b標誌的相對指針:
journalctl -b -1
查看指定時間的日誌
可以使用--since和--until選項過濾任意時間限制,這些限制分別顯示給定時間之前或之後的條目。
例如: #"顯示2017年10月30號,18點10分30秒到當前時間之間的所有日誌信息" journalctl --since="2017-10-30 18:10:30"
另外,journal還能夠理解部分相對值及命名簡寫。例如,大家可以使用“yesterday”、“today”、“tomorrow”或者“now”等表達。另外,我們也可以使用“-”或者“+”設定相對值,或者使用“ago”之前的表達。
例如獲取昨天的日誌如下:
journalctl –since yesterday
獲取某一個時間段到當前時間的前一個小時的日誌
journalctl --since 09:00 --until "1 hour ago"
獲取當前時間的前20分鐘的日誌
journalctl --since "20 min ago"
獲取某一天到某一個時間段的日誌信息
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
如您所見,定義靈活的時間窗口來過濾您希望看到的條目相對容易。
按消息興趣過濾
我們在上面學習了一些可以使用時間限制來過濾日記數據的方法。在本節中,我們將討論如何根據您感興趣的服務或組件來進行過濾。systemd日記提供了多種方法來執行此操作。
按服務
也許最有用的過濾方式是你感興趣的單位。我們可以使用這個-u選項來過濾。
例如,查看httpd服務的日誌信息
[root@centos7 ~]# journalctl -u httpd.service
-- Logs begin at Thu 2018-02-22 17:01:47 CST, end at Thu 2018-02-22 17:30:01 CST. --
Feb 22 17:29:27 centos7.localdomain systemd[1]: Starting The Apache HTTP Server...
Feb 22 17:29:27 centos7.localdomain httpd[1610]: AH00558: httpd: Could not reliably determine t
Feb 22 17:29:28 centos7.localdomain systemd[1]: Started The Apache HTTP Server.
也可以查看httpd服務當天的運行狀況
journalctl -u httpd.service --since today
按進程、用戶或者群組ID
由於某些服務當中包含多個子進程,因此如果我們希望通過進程ID實現查詢,也可以使用相關過濾機制。
這裏需要指定_PID字段。例如,如果PID為8088,則可輸入:
journalctl _PID=8088
有時候我們可能希望顯示全部來自特定用戶或者群組的日誌條目,這就需要使用_UID或者_GID。例如,如果大家的Web服務器運行在www-data用戶下,則可這樣找到該用戶ID:
id -u www-data
33
1
2
3
4
接下來,我們可以使用該ID返回過濾後的journal結果:
journalctl _UID=33 --since today
Systemd journal擁有多種可實現過濾功能的字段。其中一些來自被記錄的進程,有些則由journald用於自系統中收集特定時間段內的日誌。
之前提到的_PID屬於後一種。Journal會自動記錄並檢索進程PID,以備日後過濾之用。大家可以查看當前全部可用journal字段:
man systemd.journal-fields
下面來看針對這些字段的過濾機制。-F選項可用於顯示特定journal字段內的全部可用值。
例如,要查看systemd journal擁有條目的群組ID,可使用以下命令:
[root@centos7 ~]# journalctl -F _GID
995
42
40
70
172
998
81
0
其將顯示全部journal已經存儲至群組ID字段內的值,並可用於未來的過濾需求。
按優先級
管理員們可能感興趣的另一種過濾機制為信息優先級。盡管以更為詳盡的方式查看日誌也很有必要,不過在理解現有信息時,低優先級日誌往往會分散我們的註意力並導致理解混亂。
大家可以使用journalctl配合-p選項顯示特定優先級的信息,從而過濾掉優先級較低的信息。
例如,只顯示錯誤級別或者更高的日誌條目:
[root@centos7 ~]# journalctl -p err -b
-- Logs begin at Thu 2018-02-22 17:01:47 CST, end at Thu 2018-02-22 17:40:02 CST. --
Feb 22 17:09:10 centos7.localdomain kernel: sd 0:0:0:0: [sda] Assuming drive cache: write throu
Feb 22 17:09:12 centos7.localdomain kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not
Feb 22 17:09:15 centos7.localdomain rsyslogd[593]: error during parsing file /etc/rsyslog.conf,
Feb 22 17:09:47 centos7.localdomain pulseaudio[1232]: [alsa-sink-ES1371/1] alsa-sink.c: ALSA wo
Feb 22 17:09:47 centos7.localdomain pulseaudio[1232]: [alsa-sink-ES1371/1] alsa-sink.c: Most li
Feb 22 17:09:47 centos7.localdomain pulseaudio[1232]: [alsa-sink-ES1371/1] alsa-sink.c: We were
Feb 22 17:09:48 centos7.localdomain spice-vdagent[1274]: Cannot access vdagent virtio channel /
lines 1-8/8 (END)
這將只顯示被標記為錯誤、嚴重、警告或者緊急級別的信息。Journal的這種實現方式與標準syslog信息在級別上是一致的。大家可以使用優先級名稱或者其相關量化值。以下各數字為由最高到最低優先級:
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
例如:
[root@centos7 ~]# journalctl -p 3 -b
-- Logs begin at Thu 2018-02-22 17:01:47 CST, end at Thu 2018-02-22 17:50:01 CST. --
Feb 22 17:09:10 centos7.localdomain kernel: sd 0:0:0:0: [sda] Assuming drive cache: write throu
Feb 22 17:09:12 centos7.localdomain kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not
Feb 22 17:09:15 centos7.localdomain rsyslogd[593]: error during parsing file /etc/rsyslog.conf,
Feb 22 17:09:47 centos7.localdomain pulseaudio[1232]: [alsa-sink-ES1371/1] alsa-sink.c: ALSA wo
Feb 22 17:09:47 centos7.localdomain pulseaudio[1232]: [alsa-sink-ES1371/1] alsa-sink.c: Most li
Feb 22 17:09:47 centos7.localdomain pulseaudio[1232]: [alsa-sink-ES1371/1] alsa-sink.c: We were
Feb 22 17:09:48 centos7.localdomain spice-vdagent[1274]: Cannot access vdagent virtio channel /
lines 1-8/8 (END)
修改journal顯示內容
到這裏,過濾部分已經介紹完畢。我們也可以使用多種方式對輸出結果進行修改,從而調整journalctl的顯示內容。
分頁顯示(默認)或者改為正常標準輸出
分頁顯示,其中插入省略號以代表被移除的信息,使用–no-full選
journalctl --no-full
. . .
Feb 04 20:54:13 journalme sshd[937]: Failed password for root from 83.234.207.60...h2
Feb 04 20:54:13 journalme sshd[937]: Connection closed by 83.234.207.60 [preauth]
大家也可以要求其顯示全部信息,無論其是否包含不可輸出的字符。具體方式為添加-a標記:
journalctl -a
默認情況下,journalctl會在pager內顯示輸出結果以便於查閱。如果大家希望利用文本操作工具對數據進行處理,則可能需要使用標準格式。在這種情況下,我們需要使用–no-pager選項:
journalctl --no-pager
這樣就可以用一些工具過濾出自己感興趣的信息了
下面來介紹下輸出格式
如果大家需要對journal條目進行處理,則可能需要使用更易使用的格式以簡化數據解析工作。幸運的是,journal能夠以多種格式進行顯示,只須添加-o選項加格式說明即可。
例如,我們可以將journal條目輸出為JSON格式:
[root@centos7 ~]# journalctl -b -u httpd -o json
{ "__CURSOR" : "s=8fa6a8a1c6264c7b938e4d23584ae602;i=149d;b=63f75abbe94c4087bc2cc3cdb3b57100;m=46edf6e6;t=565c9ae1d38f7;x=b3a1eaebceb26d5b", "__REALTIME_TIMESTAMP" : "1519291767535863", "__MONOTONIC_TIMESTAMP"
{ "__CURSOR" : "s=8fa6a8a1c6264c7b938e4d23584ae602;i=149e;b=63f75abbe94c4087bc2cc3cdb3b57100;m=46f3506d;t=565c9ae22927d;x=91ef081943191196", "__REALTIME_TIMESTAMP" : "1519291767886461", "__MONOTONIC_TIMESTAMP"
{ "__CURSOR" : "s=8fa6a8a1c6264c7b938e4d23584ae602;i=149f;b=63f75abbe94c4087bc2cc3cdb3b57100;m=46f7a7e4;t=565c9ae26e9f5;x=1f0dc6e3105af151", "__REALTIME_TIMESTAMP" : "1519291768170997", "__MONOTONIC_TIMESTAMP"
這種方式對於工具解析非常重要。大家也可以使用json-pretty格式以更好地處理數據結構,這種方法易讀性,顯示的內容也比較全面:
[root@centos7 ~]# journalctl -u httpd -o json-pretty
{
"__CURSOR" : "s=8fa6a8a1c6264c7b938e4d23584ae602;i=149d;b=63f75abbe94c4087bc2cc3cdb3b57
"__REALTIME_TIMESTAMP" : "1519291767535863",
"__MONOTONIC_TIMESTAMP" : "1190000358",
"_BOOT_ID" : "63f75abbe94c4087bc2cc3cdb3b57100",
"PRIORITY" : "6",
"_UID" : "0",
"_GID" : "0",
"_MACHINE_ID" : "534ca72579bb44b4b5c707ba441967eb",
"_HOSTNAME" : "centos7.localdomain",
"SYSLOG_FACILITY" : "3",
"SYSLOG_IDENTIFIER" : "systemd",
"_TRANSPORT" : "journal",
"_PID" : "1",
"_COMM" : "systemd",
"_EXE" : "/usr/lib/systemd/systemd",
"_CAP_EFFECTIVE" : "1fffffffff",
"_SYSTEMD_CGROUP" : "/",
"CODE_FILE" : "src/core/unit.c",
"CODE_LINE" : "1417",
"CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
"MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5",
"_CMDLINE" : "/usr/lib/systemd/systemd --switched-root --system --deserialize 21",
"_SELINUX_CONTEXT" : "system_u:system_r:init_t:s0",
"UNIT" : "httpd.service",
"MESSAGE" : "Starting The Apache HTTP Server...",
"_SOURCE_REALTIME_TIMESTAMP" : "1519291767533650"
}
以下為可用於顯示的各類格式:
cat: 只顯示信息字段本身。
export: 適合傳輸或備份的二進制格式。
json: 標準JSON,每行一個條目。
json-pretty: JSON格式,適合人類閱讀習慣。
json-sse: JSON格式,經過打包以兼容server-sent事件。
short: 默認syslog類輸出格式。
short-iso: 默認格式,強調顯示ISO 8601掛鐘時間戳。
short-monotonic: 默認格式,提供普通時間戳。
short-precise: 默認格式,提供微秒級精度。
verbose: 顯示該條目的全部可用journal字段,包括通常被內部隱藏的字段。
活動進程監控
Journalctl命令還能夠幫助管理員以類似於tail的方式監控活動或近期進程。這項功能內置於journalctl當中,允許大家在無需借助其它工具的前提下實現訪問。
顯示近期日誌
要顯示特定數量的記錄,大家可以使用-n選項,類似為tail -n功能。默認情況下只顯示最後發生的10條日誌,但是也可以指定。
例如:
[root@centos7 ~]# journalctl -n20
-- Logs begin at Thu 2018-02-22 17:01:47 CST, end at Thu 2018-02-22 18:20:01 CST. --
Feb 22 17:40:01 centos7.localdomain systemd[1]: Started Session 5 of user root.
Feb 22 17:40:02 centos7.localdomain systemd[1]: Starting Session 5 of user root.
Feb 22 17:40:02 centos7.localdomain CROND[1754]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 22 17:50:01 centos7.localdomain systemd[1]: Started Session 6 of user root.
Feb 22 17:50:01 centos7.localdomain systemd[1]: Starting Session 6 of user root.
Feb 22 17:50:01 centos7.localdomain CROND[1855]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 22 18:00:01 centos7.localdomain systemd[1]: Started Session 7 of user root.
Feb 22 18:00:01 centos7.localdomain CROND[1962]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 22 18:00:01 centos7.localdomain systemd[1]: Starting Session 7 of user root.
Feb 22 18:01:01 centos7.localdomain systemd[1]: Started Session 8 of user root.
Feb 22 18:01:01 centos7.localdomain systemd[1]: Starting Session 8 of user root.
Feb 22 18:01:01 centos7.localdomain CROND[1983]: (root) CMD (run-parts /etc/cron.hourly)
Feb 22 18:01:01 centos7.localdomain run-parts(/etc/cron.hourly)[1989]: starting 0anacron
Feb 22 18:01:01 centos7.localdomain run-parts(/etc/cron.hourly)[1996]: finished 0anacron
Feb 22 18:10:01 centos7.localdomain systemd[1]: Started Session 9 of user root.
Feb 22 18:10:01 centos7.localdomain CROND[2092]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 22 18:10:01 centos7.localdomain systemd[1]: Starting Session 9 of user root.
Feb 22 18:20:01 centos7.localdomain systemd[1]: Started Session 10 of user root.
Feb 22 18:20:01 centos7.localdomain CROND[2197]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 22 18:20:01 centos7.localdomain systemd[1]: Starting Session 10 of user root.
追蹤日誌
要主動追蹤當前正在編寫的日誌,大家可以使用-f標記。同樣功能類似為tail -f,只要不終止,會一直監控
journalctl -f
Journal維護
存儲這麽多數據當然會帶來巨大壓力,因此我們還需要了解如何清理部分陳舊日誌以釋放存儲空間。
查看當前日誌占用磁盤的空間的總大小
[root@centos7 ~]# journalctl --disk-usage
Archived and active journals take up 8.0M on disk.
指定日誌文件最大空間
journalctl --vacuum-size=1G
指定日誌文件保存多久
journalctl --vacuum-time=1years
journalctl相關配置
大家可以配置自己的服務器以限定journal所能占用的最高容量。要實現這一點,我們需要編輯/etc/systemd/journald.conf文件。
以下條目可用於限定journal體積的膨脹速度:
SystemMaxUse=: 指定journal所能使用的最高持久存儲容量。
SystemKeepFree=: 指定journal在添加新條目時需要保留的剩余空間。
SystemMaxFileSize=: 控制單一journal文件大小,符合要求方可被轉為持久存儲。
RuntimeMaxUse=: 指定易失性存儲中的最大可用磁盤容量(/run文件系統之內)。
RuntimeKeepFree=: 指定向易失性存儲內寫入數據時為其它應用保留的空間量(/run文件系統之內)。
RuntimeMaxFileSize=: 指定單一journal文件可占用的最大易失性存儲容量(/run文件系統之內)。
通過設置上述值,大家可以控制journald對服務器空間的消耗及保留方式。
journalctl工具基礎介紹