在CentOS 7開始使用的systemd使用了journal日志,這個日志的管理方式和以往使用syslog的方式不同,可以通過管理工具維護。
使用df -h
檢查磁盤文件,可以看到/run
目錄下有日志目錄/run/log/journal
,占用了數G空間
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 8.5G 4.2G 4.4G 49% /
tmpfs 16G 1.6G 15G 11% /run
在日志目錄下有很多歷史累積的日志。
檢查當前journal使用磁盤量
journalctl --disk-usage
清理方法可以采用按照日期清理,或者按照允許保留的容量清理
journalctl --vacuum-time=2d
journalctl --vacuum-size=500M
如果要手工刪除日志文件,則在刪除前需要先輪轉一次journal日志
systemctl kill --kill-who=main --signal=SIGUSR2 systemd-journald.service
要啟用日志限制持久化配置,可以修改 /etc/systemd/journald.conf
SystemMaxUse=16M
ForwardToSyslog=no
然后重啟
systemctl restart systemd-journald.service
檢查journal是否運行正常以及日志文件是否完整無損壞
journalctl --verify
journal配置參考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=500
SystemMaxUse=2048M
#SystemKeepFree=1024M
#SystemMaxFileSize=
RuntimeMaxUse=2048M
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
ForwardToKMsgno=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
MaxLevelStore=warning
MaxLevelSyslog=warning
MaxLevelKMsg=warning
MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
|
配置目錄及其優先級
默認設置是在編譯期間確定的, 所以僅在確實需要修改默認設置的情況下, 才需要使用配置文件。位於 /etc/systemd/
目錄中的初始配置文件, 僅包含了展示選項默認值的注釋, 目的在於方便系統管理員查看和直接修改。
如果軟件包想要自定義某些默認設置, 那么必須將自定義的配置文件安裝到 /usr/lib/systemd/*.conf.d/
目錄中。 /etc/
目錄僅供系統管理員使用。 系統管理員可以利用下面的邏輯來覆蓋默認設置: 主配置文件最先被讀取, 優先級也最低。 所有 *.conf.d/
中的配置文件 都會覆蓋主配置文件中的設置。 所有 *.conf.d/
中的配置文件(無論位於哪個目錄中), 統一按照文件名的字典順序處理。 當多個配置文件都設置了同一個選項的時候: (1)如果該選項僅接受一個單一值,那么僅以文件名最靠后(字典順序)的那一個為准; (2)如果該選項可接受一個值列表,那么將會按照文件名的字典順序將所有值列表拼接起來。 為了便於排序, 建議給所有 *.conf.d/
中的配置文件 都加上兩位十進制數字的文件名前綴。
如果系統管理員想要屏蔽 /usr/lib/
目錄中的某個配置文件, 那么最佳做法是在 /etc/
目錄中 創建一個指向 /dev/null
的同名符號鏈接, 即可徹底屏蔽 /usr/lib/
目錄中的同名文件。
選項
所有選項都位於 "[Journal]
" 小節:
-
Storage=
-
在哪里存儲日志文件: "
volatile
" 表示僅保存在內存中, 也就是僅保存在/run/log/journal
目錄中(將會被自動按需創建)。 "persistent
" 表示優先保存在磁盤上, 也就優先保存在/var/log/journal
目錄中(將會被自動按需創建), 但若失敗(例如在系統啟動早期"/var"尚未掛載), 則轉而保存在/run/log/journal
目錄中(將會被自動按需創建)。 "auto
"(默認值) 與 "persistent
" 類似, 但不自動創建/var/log/journal
目錄, 因此可以根據該目錄的存在與否決定日志的保存位置。 "none
" 表示不保存任何日志(直接丟棄所有收集到的日志), 但日志轉發(見下文)不受影響。 默認值是 "auto
" -
Compress=
-
默認值"yes"表示: 壓縮存儲大於特定閾值的對象。
-
Seal=
-
默認值"yes"表示:如果存在一個"sealing key"(由 journalctl(1) 的
--setup-keys
命令創建), 那么就為所有持久保存的日志文件啟用 FSS(Seekable Sequential Key Generators)保護, 以避免日志文件被惡意或無意的修改。 -
SplitMode=
-
設置是否按照每個用戶分割日志文件,以實現對日志的訪問控制(日志守護進程會確保每個用戶都能讀取自己的日志文件)。 可以使用的分割策略如下: "
uid
" 表示每個用戶都有自己專屬的日志文件(無論該用戶是否擁有登錄會話),但系統用戶的日志依然記錄到系統日志中。這是默認值。 "none
" 表示不對日志文件按不同用戶進行分割,而是將所有日志都記錄到系統日志中。這意味着非特權用戶根本無法讀取屬於自己的日志信息。 注意,僅分割持久保存的日志(/var/log/journal
), 永不分割內存中的日志(/run/log/journal
)。 -
RateLimitIntervalSec=
,RateLimitBurst=
-
用於限制日志的生成速度(設為零表示不作限制)。
RateLimitIntervalSec=
用於設置一個時間段長度,默認值是30秒。RateLimitBurst=
用於設置一個正整數,表示消息條數,默認值是1000條。 表示在RateLimitIntervalSec=
時間段內, 每個服務最多允許產生RateLimitBurst=
數量(條數)的日志。 在同一個時間段內,超出數量限制的日志將被丟棄,直到下一個時間段才能再次開始記錄。 對於所有被丟棄的日志消息,僅用一條類似"xxx條消息被丟棄"的消息來代替。 這個限制是針對每個服務的限制,一個服務超限並不會影響到另一個服務的日志記錄。RateLimitIntervalSec=
可以使用下面的時間單位:"ms
", "s
", "min
", "h
", "d
" -
SystemMaxUse=
,SystemKeepFree=
,SystemMaxFileSize=
,SystemMaxFiles=
,RuntimeMaxUse=
,RuntimeKeepFree=
,RuntimeMaxFileSize=
,RuntimeMaxFiles=
-
限制日志文件的大小上限。 以 "
System
" 開頭的選項用於限制磁盤使用量, 也就是/var/log/journal
的使用量。 以 "Runtime
" 開頭的選項用於限制內存使用量, 也就是/run/log/journal
的使用量。 以 "System
" 開頭的選項僅在/var/log/journal
目錄確實存在且可寫時才有意義。 但以 "Runtime
" 開頭的選項永遠有意義。 也就是說, 在系統啟動早期/var
尚未掛載時、 或者系統管理員禁止在磁盤上存儲日志的時候, 僅有 "Runtime
" 開頭的選項有意義。 journalctl 與 systemd-journald 工具會忽略日志目錄中 所有后綴名不等於 ".journal
" 或 ".journal~
" 的文件。 換句話說, 日志目錄中不應該存在后綴名不等於 ".journal
" 或 ".journal~
" 的文件, 因為這些文件永遠不會被清理。SystemMaxUse=
與RuntimeMaxUse=
限制全部日志文件加在一起最多可以占用多少空間。SystemKeepFree=
與RuntimeKeepFree=
表示除日志文件之外,至少保留多少空間給其他用途。 systemd-journald 會同時考慮這兩個因素, 並且盡量限制日志文件的總大小,以同時滿足這兩個限制。SystemMaxUse=
與RuntimeMaxUse=
的默認值是10%空間與4G空間兩者中的較小者;SystemKeepFree=
與RuntimeKeepFree=
的默認值是15%空間與4G空間兩者中的較大者; 如果在 systemd-journald 啟動時, 文件系統即將被填滿並且已經超越了SystemKeepFree=
或RuntimeKeepFree=
的限制,那么日志記錄將被暫停。 也就是說,如果在創建日志文件時,文件系統有充足的空閑空間, 但是后來文件系統被其他非日志文件過多占用, 那么 systemd-journald 只會立即暫停日志記錄, 但不會刪除已經存在的日志文件。SystemMaxFileSize=
與RuntimeMaxFileSize=
限制單個日志文件的最大體積, 到達此限制后日志文件將會自動滾動。 默認值是對應的SystemMaxUse=
與RuntimeMaxUse=
值的1/8 , 這也意味着日志滾動默認保留7個歷史文件。日志大小的值可以使用以1024為基數的 K, M, G, T, P, E 后綴, 分別對應於 1024, 1024², … 字節。
SystemMaxFiles=
與RuntimeMaxFiles=
限制最多允許同時存在多少個日志文件, 超出此限制后, 最老的日志文件將被刪除, 而當前的活動日志文件則不受影響。 默認值為100個。 -
MaxFileSec=
-
日志滾動的時間間隔。 通常並不需要使用基於時間的日志滾動策略, 因為由
SystemMaxFileSize=
與RuntimeMaxFileSize=
控制的基於文件大小的日志滾動策略 已經可以確保日志文件的大小不會超標。 默認值是一個月, 設為零表示禁用基於時間的日志滾動策略。 可以使用 "year
", "month
", "week
", "day
", "h
", "m
" 時間后綴, 若不使用后綴則表示以秒為單位。 -
MaxRetentionSec=
-
日志文件的最大保留期限。 當日志文件的最后修改時間超過此期限后將被刪除。 默認值零表示不使用基於時間的日志刪除策略。 通常並不需要使用基於時間的日志刪除策略,因為由
SystemMaxUse=
與RuntimeMaxUse=
控制的基於文件大小的日志滾動策略 已經可以確保日志文件的大小不會超標。 可以使用 "year
", "month
", "week
", "day
", "h
", "m
" 時間后綴, 若不使用后綴則表示以秒為單位。 -
SyncIntervalSec=
-
向磁盤刷寫日志文件的時間間隔,默認值是五分鍾。 刷寫之后,日志文件將會處於離線(OFFLINE)狀態。 注意,當接收到 CRIT, ALERT, EMERG 級別的日志消息后, 將會無條件的立即刷寫日志文件。 因此該設置僅對 ERR, WARNING, NOTICE, INFO, DEBUG 級別的日志消息有意義。
-
ForwardToSyslog=
,ForwardToKMsg=
,ForwardToConsole=
,ForwardToWall=
-
ForwardToSyslog=
表示是否將接收到的日志消息轉發給傳統的 syslog 守護進程,默認值為"no"。 如果設為"yes",但是沒有任何進程監聽對應的套接字,那么這種轉發是無意義的。 此選項可以被內核引導選項 "systemd.journald.forward_to_syslog
" 覆蓋。ForwardToKMsg=
表示是否將接收到的日志消息轉發給內核日志緩沖區(kmsg),默認值為"no"。 此選項可以被內核引導選項 "systemd.journald.forward_to_kmsg
" 覆蓋。ForwardToConsole=
表示是否將接收到的日志消息轉發給系統控制台,默認值為"no"。 如果設為"yes",那么可以通過下面的TTYPath=
指定轉發目標。 此選項可以被內核引導選項 "systemd.journald.forward_to_console
" 覆蓋。ForwardToWall=
表示是否將接收到的日志消息作為警告信息發送給所有已登錄用戶,默認值為"yes"。 此選項可以被內核引導選項 "systemd.journald.forward_to_wall
" 覆蓋。 -
MaxLevelStore=
,MaxLevelSyslog=
,MaxLevelKMsg=
,MaxLevelConsole=
,MaxLevelWall=
-
MaxLevelStore=
設置記錄到日志文件中的最高日志等級,默認值為"debug
";MaxLevelSyslog=
設置轉發給傳統的 syslog 守護進程的最高日志等級,默認值為"debug
";MaxLevelKMsg=
設置轉發給內核日志緩沖區(kmsg)的最高日志等級,默認值為"notice
";MaxLevelConsole=
設置轉發給系統控制台的最高日志等級,默認值為"info
";MaxLevelWall=
設置作為警告信息發送給所有已登錄用戶的最高日志等級,默認值為"emerg
"; 這些選項既可以設為日志等級的名稱, 也可以設為日志等級對應的數字: "emerg
"(0), "alert
"(1), "crit
"(2), "err
"(3), "warning
"(4), "notice
"(5), "info
"(6), "debug
"(7) 。 所有高於設定等級的日志消息都將被直接丟棄, 僅保存/轉發小於等於設定等級的日志消息。 上述設置可以被如下內核引導選項覆蓋: "systemd.journald.max_level_store=
", "systemd.journald.max_level_syslog=
", "systemd.journald.max_level_kmsg=
", "systemd.journald.max_level_console=
", "systemd.journald.max_level_wall=
" -
ReadKMsg=
-
是否收集內核日志。 默認值 yes 表示從
/dev/kmsg
中讀取內核產生的日志消息。 -
TTYPath=
-
指定
ForwardToConsole=yes
時所使用的控制台TTY, 默認值是/dev/console
-
LineMax=
-
在將日志流轉化為日志記錄時,每條日志記錄最大允許的長度(字節)。 如果將單元的標准輸出(STDOUT)/標准錯誤(STDERR)通過流套接字連接到日志中, 那么將會以換行符("
\n
", ASCII 10)與NUL字符("\0
", ASCII 0)作為分割符, 把日志流切分成一條條獨立的日志記錄。 如果超過此處設置的長度之后仍然沒有遇到分割符, 那么將會自動插入一個分割符,以強制將單行超長日志截斷為多行。 此選項的值越大,每個日志流客戶端日志守護進程占用的內存也越大(最大值等於此選項的值)。 另外,此選項的值太大也會造成與傳統日志傳輸協議的不兼容(太長的日志無法封裝在單個AF_UNIX
或AF_INET
報文內)。 此選項的值以字節為單位,同時也可以在數字的末尾加上 K, M, G, T 后綴(以1024為基准)。 默認值 48K 是一個足夠大並且也能保持與傳統日志傳輸協議兼容的值。 注意,不能設為小於 79 的值(將被自動提升到79)。
日志轉發
有兩種不同的日志轉發方法: (1)通過套接字文件(/run/systemd/journal/syslog
) 可以將收集到的日志消息 立即轉發給套接字的監聽進程(傳統的 syslog 守護進程)。 此方法受 ForwardToSyslog=
指令的控制。 (2)日志接收進程作為客戶端運行,就像 journalctl(1) 一樣讀取日志文件。 因此,此方法在 Storage=none
時無效。 此方法不能實時讀取日志消息, 但是可以讀取先前保存的日志消息(例如在系統啟動完成之后讀取系統啟動早期的日志消息)。 此方法還可以讀取到完整的日志元數據。 此方法一般無法讀取當前最新的日志消息, 只能讀取已經被記錄到文件系統上的日志消息。 注意,syslog 守護進程通常使用此方法(而不是前一種方法), 因此 Storage=
選項(而不是 ForwardToSyslog=
選項) 不應該設為"none"。