當 rsyslog 尚未執行時,如何在 rsyslog 中記錄早期日誌?
我
rsyslog
在 Debian Buster 上使用。我使用的是 old-style
sysvinit
,而不是 systemd 。rsyslog
在大多數 init 腳本執行之後,在 init 啟動序列的後期開始。
dmesg
啟動過程中的消息和來自在 rsyslog 啟動之前執行的其他啟動腳本的其他早期日誌消息不會失去。rsyslog
將在啟動時立即記錄它們。當 rsyslog 未執行時,這些消息儲存在哪裡?
我可以在啟動 rsyslog 之前清除此“記憶體”,以便不記錄早期啟動消息嗎?
或者,更好的是,我可以將它們過濾掉,以便它們登錄到主 syslog 文件:
*.* -/var/log/syslog
但未登錄另一個:
*.* |/dev/xconsole
更新和澄清
我意識到我要解決的問題可能並不完全清楚。所以這裡是對情況的一些澄清:
除了標準
syslog
日誌記錄(即,/var/log/syslog
),我還將相同的資訊記錄到/dev/xconsole
,當我以使用者身份登錄我的桌面會話時,我在後台使用以下命令在終端:cat /dev/xconsole
這樣,我可以立即看到新的日誌出現在我的後台。此外,與正常文件不同,
/dev/xconsole
它在被讀取後被清空。因此,當我註銷並重新登錄時,我看不到舊消息,而只會看到新消息。現在的問題是,啟動後,核心緩衝區中的日誌太多了,以至於啟動時,它用無用的調試早期啟動資訊
rsyslog
填滿了整個容量。/dev/xconsole
而且我最感興趣的是後期引導消息,而這些都不見了。只有在我
cat
/dev/xconsole
第一次之後,我才能釋放空間,新消息才能來。我添加了這個醜陋的黑客
/etc/rsyslog.conf
::msg, startswith, "\[ " stop *.* |/dev/xconsole
這基本上丟棄了所有以個位數秒計數器開頭的早期消息
[ 0.000000]
,但接受所有後來的消息,即[ 14.348189]
這可行,但我認為這是骯髒的解決方法。
那麼,我怎樣才能擺脫我不感興趣的早期引導消息,並記錄有用的初始化引導腳本消息呢?
這個答案可能已經很晚了,OP 可能不再需要,但它可能會為其他人服務。
斯蒂芬哈里斯的回答非常好,但像 OP 一樣,
dmesg --clear
似乎對我不起作用。但是,只需在開始之前/proc/kmsg
使用類似的內容讀取即可。cat /proc/kmsg > /dev/null``rsyslog
注意:我會用評論來回答,但我沒有所需的聲譽。
該
syslog
過程通常從三個來源獲取消息:
- 應用程序,通過
/dev/log
- 網路通過埠 514
- 核心,通過
/proc/kmsg
現在第一個……傳統上,在程序開始
/dev/log
之前發送到的任何應用程序syslogd
都會失去它們的消息。systemd
有點混亂,因為它可以在那個套接字上監聽。然後syslogd
可以從systemd
. 但這似乎不是您關心的問題。第二個顯然與您的問題無關。
所以我們專注於第三個。這些是以 開頭的行
[...]
,其中數字是啟動後的時間戳。這些是核心創建的消息,而不是使用者空間應用程序。核心消息被放入“環形緩衝區”,
rsyslog
啟動時它將讀取此緩衝區以放置數據……無論配置文件說放在哪裡。在正常情況下這是好的。您需要所有核心啟動消息的日誌,以防萬一無法正常啟動。
但是,如果您不關心它們,則可以使用 command
dmesg --clear
。這將清除“環形緩衝區”。因此,如果您在啟動之前將其放入啟動序列中,rsyslog
那麼守護程序將不會讀取任何核心消息;緩衝區已被清除。現在,您如何做到這一點在很大程度上取決於您正在執行的發行版。使用傳統
sysvinit
方式,您可能希望創建一個在 syslog 啟動腳本之前執行的 RC 文件。使用 systemd,您可能希望在 syslog 程序上創建一個具有先決條件的單元。