systemd的日誌管理進程journald

使用Journalctl查看並操做Systemd日誌

systemd擁有強大的處理與系統日誌記錄功能。在使用其它工具時,日誌每每被分散在多套系統當中,由不一樣的守護進程負責處理。
Journal的實現歸功於journald守護進程,其負責處理由內核、initrd以及服務等產生的信息。node

整體思路

Systemd journal的的深層驅動力在於以集中方式管理對來自任意來源的信息。因爲大部分進程都是由systemd進程處理的,所以能夠以標準化方式實現日誌的收集與訪問。其中journald守護進程會收集所有來源的數據並將其以二進制格式加以存儲,從而實現動態操做。
將日誌數據以二進制形式存儲意味着這些數據能夠根據需求隨時以二進制輸出格式顯示。例如,能夠經過標準syslog格式查看日誌以實現日誌管理,並在須要使用圖形服務時將各條目做爲JSON對象交由圖形化服務處理。因爲數據不會以純文本形式被寫入磁盤,所以無需進行格式轉換。
能夠將systemd journal與現有syslog方案配置使用,也可利用其替代現有的syslog功能,具體取決於實際需求。儘管systemd journal足以涵蓋大部分管理工做需求,但其同時也可以補充現有日誌記錄機制。例如,能夠創建一套集中式syslog服務器,從而對來自多臺服務器的數據進行編譯,或者也可以利用systemd journal未來自多項服務的日誌彙總在單一系統中。nginx

設置系統時間

使用二進制journal的一大好處在於,它可以以UTC或本地時間顯示日誌記錄。在默認狀況下,systemd會以本地時間顯示結果。
有鑑於此,在使用journal以前,首先要確保時區獲得正確設置。Systemd套件中還提供一款timedatectl工具,專門用於解決此問題。
首先,利用list-timezones選項查看可用時區:web

timedatectl list-timezones

結果將列出系統上可用的所有時區。然後選擇與服務器所在地相匹配的項目,並使用set-timezone選項加以設置:shell

timedatectl set-timezone Asia/Shanghai

爲了確保設置使用正確的時間,可單獨使用timedatectl命令或者添加status選項。顯示結果以下:數據庫

root@node2:~# timedatectl status
                      Local time: 日 2019-01-06 20:05:20 CST
                  Universal time: 日 2019-01-06 12:05:20 UTC
                        RTC time: 日 2019-01-06 12:05:20
                       Time zone: Asia/Shanghai (CST, +0800)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no

基礎日誌查看

要查看journald守護進程收集到的日誌,可以使用journalctl命令。
在單獨使用時,系統中的每一個journal條目都會被顯示在單一pager中。條目時間越早,排列越靠前json

[root@ansible ~]# journalctl
-- Logs begin at 六 2018-07-21 16:57:30 CST, end at 日 2019-01-06 20:09:20 CST. --
7月 21 16:57:30 localhost.localdomain systemd-journal[336]: Runtime journal is using 6.1M (max 48.9M, leaving 73.4M of free 483.6M, current limi
7月 21 16:57:30 localhost.localdomain systemd-journal[336]: Runtime journal is using 6.1M (max 48.9M, leaving 73.4M of free 483.6M, current limi
7月 21 16:57:30 localhost.localdomain kernel: Initializing cgroup subsys cpuset
7月 21 16:57:30 localhost.localdomain kernel: Initializing cgroup subsys cpu
7月 21 16:57:30 localhost.localdomain kernel: Initializing cgroup subsys cpuacct
7月 21 16:57:30 localhost.localdomain kernel: Linux version 3.10.0-229.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.2 20140120 
7月 21 16:57:30 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-229.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=
7月 21 16:57:30 localhost.localdomain kernel: Disabled fast string operations
7月 21 16:57:30 localhost.localdomain kernel: e820: BIOS-provided physical RAM map:
7月 21 16:57:30 localhost.localdomain kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
7月 21 16:57:30 localhost.localdomain kernel: BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
7月 21 16:57:30 localhost.localdomain kernel: BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
7月 21 16:57:30 localhost.localdomain kernel: BIOS-e820: [mem 0x0000000000100000-0x000000003fedffff] usable
7月 21 16:57:30 localhost.localdomain kernel: BIOS-e820: [mem 0x000000003fee0000-0x000000003fefefff] ACPI data
lines 1-15

能夠進行翻頁查看,若是系統運行時間較長,那麼systemd中的日誌將會很是多,這也證實了journal數據庫中可觀的數據量。
其格式與標準的syslog日誌很是類似。然而,其收集數據的來源較syslog要豐富得多。其中包含有來自先前引導進程、內核、initrd以及應用程序標準錯誤與輸出的日誌。均可以在journal中查看。
所有時間戳都以本地時間爲準。因爲已經爲系統正確設置了本地時間,因此顯示的時間戳也都準確無誤。centos

顯示當前引導進程下的日誌

最經常使用的是-b標記,其將顯示所有最近一次從新引導後收集到的journal條目。bash

過往引導記錄

Journal可以保存大量過往引導信息,從而容許journalctl輕鬆顯示相關內容。
在些版本會在默認狀況下保存過往引導信息,而在些則默認禁用這項功能。要啓用此功能,使用如下功能用於存儲journal信息的目錄:服務器

mkdir -p /var/log/journal

或者直接編輯journal配置文件:/etc/systemd/journald.conf
在[Journal]區段下將Storage=選項設定爲"Persistent"以啓用持久記錄。
當啓用保存過往引導信息功能後,journalctl會提供額外命令將各引導記錄做爲 獨立操做單元。要查看journald中已經記錄的引導信息,可以使用--list-boots選項:session

[root@localhost ~]# journalctl --list-boots
 0 e88acc0fcfe34290ac8d0c28a6f8e8b8 Wed 2019-01-02 10:12:42 CST—Sun 2019-01-06 20:29:40 CST

CentOS Linux release 7.6.1810 (Core) 有此選項
CentOS Linux release 7.1.1503 (Core) 無此選項

這裏每次引導都將顯示爲一行。第一列可用於在journalctl中引用該次引導。若是須要更爲準確的引導方式,由可在第二列中找到引導ID。末尾的兩次時間爲當次引導的開始與結束時間。
要顯示這些引導中的具體信息,則可以使用第一列或第二列提供的信息。
例如,要查看上次引導的journal記錄,則可以使用-1相對指針配合-b標記:

journalctl -b -1

另外,也可使用引導ID:

journalctl -b e88acc0fcfe34290ac8d0c28a6f8e8b8

時間窗

按照引導環境查看日誌條目固然很是重要,但每每還須要使用與系統引導無關的時間窗做爲瀏覽基準。這種狀況在長期運行的服務器中較爲常見。
能夠利用--since與--until選項設定時間段,兩者分別負責說明給定時間以前與以後的記錄。
時間值能夠多種格式輸出。對於絕對時間值,可使用如下格式:

YY-MM-DD HH:MM:SS

使用,能夠經過如下命令查看所有2019年1月6日 下午5:15以後的條目:

journalctl --since "2019-01-06 17:15:00"

若是以上格式中的某些組成部分未進行填寫,系統會直接進行默認填充。例如,若是日期部分未填寫,則會直接顯示當前日期。若是時間部分未填寫,則缺乏使用"00:00:00"(午夜)。第二字段亦可留空,默認爲"00":

journalctl --since "2019-01-06" --until "2019-01-06 03:00"

另外,journal還可以理解部分相對值及命名簡寫。例如,你們可使用"yesterday"、"today"、"tomorrow"或者"now"等表達。另外也可使用"-"或者"+"設定相對值,或者使用"ago"以前的表達。
獲取昨天數據的命令以下:

journalctl --since yesterday

按信息類型過濾

如何利用感興趣的服務或者組件類型實現過濾。Systemd journal一樣提供多種方式。

按單元

最經常使用的此類過濾方式當屬按單元過濾了。可使用-u選項實現這一效果。
例如,要查看系統上所有來自httpd單元的日誌,可以使用如下命令:

journalctl -u httpd.service

通常來詩刊是,可能須要同時按單元與時間進行信息過濾。例如,檢查今天某項服務的運行狀態:

journalctl -u httpd.service --since today

這種能力對於不一樣程序間交互及系統調試顯然很是重要。

按進程、用戶或者羣組ID

因爲某些服務當中包含多個子進程,所以咱們但願經過進程ID實現查詢,也可使用相關過濾機制。
這裏須要指定_PID字段。例如PID爲1443,則可輸入:

journalctl _PID=1443

有時候可能但願顯示所有來自特定用戶或者羣組的日誌條目,就須要使用_UID或者_GID。例如,web服務器運行在www-data用戶下,則能夠這樣找到該用戶ID:

id -u www-data
33

接下來,可使用該ID返回過濾後的journal結果:

journalctl _UID=33 --since today

Systemd journal擁有多種可實現過濾功能的字段。其中一些來自被記錄的進程,有些則由journald用於系統中收集特定時間段內的日誌。
以前提到的_PID屬於後一種。Journal會自動記錄並檢索進程PID,以備往後過濾之用。能夠查看當前所有可用journal字段。

man systemd.journal-fields

下面來看針對這些字段的過濾機制,-F選項可用於顯示特定journal字段內的所有可用值。
例如,要查看systemd journal擁有條目的羣組ID,可以使用如下命令:

[root@ansible ~]# journalctl -F _GID
998
81
996
0

其將顯示所有journal已經存儲至羣組ID字段內的值,並可用於將來的過濾需求。

按組件路徑

也能夠提供路徑位置以實現過濾。
若是該路徑指向某個可執行文件,則journalctl會顯示該可執行文件相關的所有條目。例如,要找到與bash可執行文件相關的條目:

journalctl /usr/bin/bash

通常來說,若是某個單元可用於該可執行文件,那麼此方法會更爲明確且可以提供更好的相關信息(與子進程相關的條目等)。

顯示內核信息

內核信息一般存在於dmesg輸出結果中,journal一樣可對其進行檢索。要只顯示此類信息,可添加-k或者-dmesg標記

journalctl -k

默認狀況下,其會顯示當前引導環境下的所有內核信息。也可使用常規的引導選擇標記對此前的引導記錄進行查詢。例如,要查詢五次以前引導環境的信息:

journalctl -k -b -5

按優先級

可使用journalctl配合-p選項顯示特定優先級的信息,從而過濾掉優先級較低的信息。
例如,只顯示錯誤級別或更高的日誌條目:

journalctl -p err -b

這將只顯示被傳記爲錯誤、嚴重、警告或者緊急級別的信息。journal的這種實現方式與標準syslog信息在級別上是一致的。可使用優先級名稱或者相關量化值。如下各數字爲由最高到最低優先級:

  • 0:emerg
  • 1:alert
  • 2:crit
  • 3:err
  • 4:warning
  • 5:notice
  • 6:info
  • 7:debug

以上爲可在-p選項中使用的數字或者名稱。選定某一優先級會顯示等級與之等同以及更高的信息。

輸出格式

若是要對journal條目進行處理,可能須要使用更易使用的格式以簡化數據解析工做。幸好的是,journalctl可以以多種格式時行顯示,只須添加-o選項便可。
例如,能夠將journal條目輸出爲json格式:

[root@ansible ~]# journalctl -b -u sshd -o json
{ "__CURSOR" : "s=7ef025badca74f3f94affc2d6cd6c14b;i=837;b=39a34209e2aa400eb76ee65ef44ebd63;m=ee2886;t=57ec938c503d0;x=35f1a6c29bad20b1", "__REA
{ "__CURSOR" : "s=7ef025badca74f3f94affc2d6cd6c14b;i=838;b=39a34209e2aa400eb76ee65ef44ebd63;m=ee45bf;t=57ec938c52109;x=157396b74557694b", "__REA
{ "__CURSOR" : "s=7ef025badca74f3f94affc2d6cd6c14b;i=84e;b=39a34209e2aa400eb76ee65ef44ebd63;m=f45656;t=57ec938cb319f;x=8843692b414e8e1f", "__REA
{ "__CURSOR" : "s=7ef025badca74f3f94affc2d6cd6c14b;i=84f;b=39a34209e2aa400eb76ee65ef44ebd63;m=f4579d;t=57ec938cb32e6;x=bfaf4b232abbd818", "__REA
{ "__CURSOR" : "s=7ef025badca74f3f94affc2d6cd6c14b;i=86d;b=39a34209e2aa400eb76ee65ef44ebd63;m=3940194;t=57ec93b6adcdd;x=26b0b977cf73529", "__REA
{ "__CURSOR" : "s=7ef025badca74f3f94affc2d6cd6c14b;i=88d;b=39a34209e2aa400eb76ee65ef44ebd63;m=f81e8ac;t=57ec94758c3f5;x=bc1e102400873e87", "__RE

這種方式對於工具解析很是重要。也可使用json-pretty格式以更好地處理數據結構:

[root@ansible ~]# journalctl -b -u sshd -o json-pretty
{
        "__CURSOR" : "s=7ef025badca74f3f94affc2d6cd6c14b;i=837;b=39a34209e2aa400eb76ee65ef44ebd63;m=ee2886;t=57ec938c503d0;x=35f1a6c29bad20b1",
        "__REALTIME_TIMESTAMP" : "1546777589515216",
        "__MONOTONIC_TIMESTAMP" : "15607942",
        "_BOOT_ID" : "39a34209e2aa400eb76ee65ef44ebd63",
        "PRIORITY" : "6",
        "_UID" : "0",
        "_GID" : "0",
        "_MACHINE_ID" : "5cb5c96afd104fa9990466a9c4faaf09",
        "SYSLOG_FACILITY" : "3",
        "SYSLOG_IDENTIFIER" : "systemd",
        "CODE_FILE" : "src/core/unit.c",
        "CODE_LINE" : "1115",
        "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
        "MESSAGE_ID" : "7d4958e842da4a758f6c1cdc7b36dcc5",
lines 1-15
        "_TRANSPORT" : "journal",
        "_PID" : "1",
        "_COMM" : "systemd",
        "_EXE" : "/usr/lib/systemd/systemd",
        "_CAP_EFFECTIVE" : "1fffffffff",
        "_SYSTEMD_CGROUP" : "/",
        "_HOSTNAME" : "ansible.magedu.com",
        "_CMDLINE" : "/usr/lib/systemd/systemd --switched-root --system --deserialize 24",
        "_SELINUX_CONTEXT" : "system_u:system_r:init_t:s0",
        "UNIT" : "sshd.service",
        "MESSAGE" : "Starting OpenSSH server daemon...",
        "_SOURCE_REALTIME_TIMESTAMP" : "1546777589511878"
}

如下爲可用於顯示的各種格式:

  • cat:只顯示信息字段自己
  • export:適合傳輸或者備份的二進制格式
  • json:標準JSON,每行一個條目
  • json-pretty:JSON格式,適合人類閱讀習慣
  • json-see:JSON格式,通過打包以兼容server-sent事件
  • short:默認syslog類輸出格式
  • short-iso:默認格式,強調顯示ISO 8601掛鐘時間戳
  • short-monotonic:默認格式,提供普通時間戳
  • short-precise:默認格式,提供微秒級精度
  • verbose:顯示該條目的所有可用journal字段,包括一般被內核隱藏的字段

活動進程監控

journalctl還能幫助管理員以相似於tail的方式監控活動或近期進程。這項功能內置於journalctl當中,雞在無需藉助於其餘工具的前提下實現訪問。

顯示近期日誌

要顯示特定數量的記錄,可使用-n選項。
默認狀況下,其會顯示近十條記錄:

journalctl -n

能夠在-n 以後指定要查看的條目數量:

journalctl -n 20

追蹤日誌

要主動追蹤當前正在編寫的日誌,可使用-f標記。方式同tail -f:

journalctl -f

journal維護

存儲了大量數據,還須要瞭解如何清理部分隱舊日誌以釋放存儲空間。

瞭解現有磁盤使用量

能夠利用--disk-usage標記查看journal的當前磁盤使用量:

[root@ansible ~]# journalctl --disk-usage
Journals take up 8.0M on disk.

手工寫一個systemd的配置文件,讓nginx服務能夠開機啓動

[unit]  
Description=Nginx  

[Service]  
Type=oneshot  
ExecStart=/usr/bin/nginx  
StandardOutput=syslog  
StandardError=inherit  

[Install]  
WantedBy=multi-user.target  
Requires=ssh.service  
After=ssh.service

SIG信號

名稱 默認動做 說明
SIGHUP 終止進程 終端線路掛斷
SIGQUIT 創建CORE文件 終止進程,並生成core文件
SIGTERM 終止進程 軟件終止信號
SIGINTERRUPT

SIGHUP:本信號在用戶終端鏈接(正常或非正常)結束時發出,一般是在終端的控制進程結束時,通知同一session內的各個做業,這裏它們與控制終端再也不關聯
SIGQUIT:和SIGINT相似,但由QUIT字符(一般是Ctrl-\)來控制,進程在收到SIGQUIT退出時會產生core文件,在這個意義上相似於一個程序錯誤信號
SIGTERM:程序結束(terminate)信號,與SIGKILL不一樣的是該信號能夠被阻塞和處理,一般用來要求程序本身正常退出。shell命令kill缺省產生這個信號
SIGINTERRUPT:

用awk查看tcp鏈接處於各狀態的鏈接個數

[root@ansible ~]# netstat -an | awk '/tcp\>/ {s[$NF]++} END {for (a in s) {print a,s[a]}}'
LISTEN 2
ESTABLISHED 1
[root@ansible ~]# netstat -an | awk '/tcp\>/ {print $NF}' | sort | uniq -c
      1 ESTABLISHED
      2 LISTEN

參考連接:https://blog.csdn.net/zstack_org/article/details/56274966

相關文章
相關標籤/搜索