Boot

當 rsyslog 尚未執行時,如何在 rsyslog 中記錄早期日誌?

  • September 7, 2021

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過程通常從三個來源獲取消息:

  1. 應用程序,通過/dev/log
  2. 網路通過埠 514
  3. 核心,通過/proc/kmsg

現在第一個……傳統上,在程序開始/dev/log之前發送到的任何應用程序syslogd都會失去它們的消息。 systemd有點混亂,因為可以在那個套接字上監聽。然後syslogd可以從systemd. 但這似乎不是您關心的問題。

第二個顯然與您的問題無關。

所以我們專注於第三個。這些是以 開頭的行[...],其中數字是啟動後的時間戳。這些是核心創建的消息,而不是使用者空間應用程序。

核心消息被放入“環形緩衝區”,rsyslog啟動時它將讀取此緩衝區以放置數據……無論配置文件說放在哪裡。

在正常情況下這是好的。您需要所有核心啟動消息的日誌,以防萬一無法正常啟動。

但是,如果您不關心它們,則可以使用 command dmesg --clear。這將清除“環形緩衝區”。因此,如果您在啟動之前將其放入啟動序列中,rsyslog那麼守護程序將不會讀取任何核心消息;緩衝區已被清除。

現在,您如何做到這一點在很大程度上取決於您正在執行的發行版。使用傳統sysvinit方式,您可能希望創建一個在 syslog 啟動腳本之前執行的 RC 文件。使用 systemd,您可能希望在 syslog 程序上創建一個具有先決條件的單元。

引用自:https://unix.stackexchange.com/questions/606913