Systemd 統一管理全部 Unit 的啓動日誌。帶來的好處就是 ,能夠只用journalctl一個命令,查看全部日誌(內核日誌和 應用日誌)。日誌的配置文件/etc/systemd/journald.conf
journalctl
journalctl -k
journalctl -b
在該[Journal]部分下,將該Storage=選項設置爲「persistent」以啓用持久記錄: vim /etc/systemd/journald.conf . . . [Journal] Storage=persistent
在您的服務器上啓用了保存之前的引導時,journalctl提供了一些命令來幫助您將引導做爲分割單位來使用。要查看journald知道的引導,請使用如下--list-boots選項journalctl:json
[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位於第二列。您能夠經過在結束時列出的兩個時間規範來指出引導會話引用的時間。vim
要顯示來自這些引導的信息,您可使用來自第一列或第二列的信息。centos
例如,要查看上一次啓動的日誌,請使用-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」以前的表達。dom
例如獲取昨天的日誌以下:ssh
journalctl –since yesterday
獲取某一個時間段到當前時間的前一個小時的日誌ide
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實現查詢,也可使用相關過濾機制。
這裏須要指定_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)
到這裏,過濾部分已經介紹完畢。咱們也可使用多種方式對輸出結果進行修改,從而調整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
存儲這麼多數據固然會帶來巨大壓力,所以咱們還須要瞭解如何清理部分陳舊日誌以釋放存儲空間。
[root@centos7 ~]# journalctl --disk-usage Archived and active journals take up 8.0M on disk.
journalctl --vacuum-size=1G
journalctl --vacuum-time=1years
你們能夠配置本身的服務器以限定journal所能佔用的最高容量。要實現這一點,咱們須要編輯/etc/systemd/journald.conf文件。
如下條目可用於限定journal體積的膨脹速度:
SystemMaxUse=: 指定journal所能使用的最高持久存儲容量。 SystemKeepFree=: 指定journal在添加新條目時須要保留的剩餘空間。 SystemMaxFileSize=: 控制單一journal文件大小,符合要求方可被轉爲持久存儲。 RuntimeMaxUse=: 指定易失性存儲中的最大可用磁盤容量(/run文件系統以內)。 RuntimeKeepFree=: 指定向易失性存儲內寫入數據時爲其它應用保留的空間量(/run文件系統以內)。 RuntimeMaxFileSize=: 指定單一journal文件可佔用的最大易失性存儲容量(/run文件系統以內)。 經過設置上述值,你們能夠控制journald對服務器空間的消耗及保留方式。