journald - 將歸檔日誌重新發送到日誌套接字
我有一個同時具有
systemd
和的嵌入式設備rsyslog
。journald
是本地日誌記錄和rsyslog
遠端日誌記錄的主要機制。rsyslog 並不總是在執行,僅在需要調試時才啟動。啟動 rsyslog 後,它只會轉發從該時間點發生的事件。我正試圖讓它轉發目前在日誌中可用的所有日誌。
正確的方法是啟用
$ModLoad imjournal
in/etc/rsyslog.conf
。這將允許 rsyslog 讀取 journald 的歸檔文件。我在一個沒有可用於 rsyslog 的 imjournal 模組的嵌入式系統上,我正在尋找一種解決方法。
一種這樣的解決方法是讓 journald 將之前的所有存檔日誌重新發送到 rsyslog 正在偵聽的套接字(現在處於活動狀態)。
有沒有辦法做到這一點?
這樣的功能在日誌中並不真正可用。
journald.conf手冊頁記錄了以下限制
ForwardToSyslog=
:如果啟用了轉發到 syslog 但沒有從套接字讀取消息,則轉發到 syslog 無效。
這就是早期啟動消息失去的原因。手冊頁還指出:
和
$$ imjournal $$,不必立即讀取消息,這允許僅在引導後期啟動的日誌記錄守護程序訪問自系統啟動以來的所有消息。
這就是為什麼推薦使用這種方法的原因。
我猜想在第一次啟動 rsyslog 時可以完成“kludge”,方法是向它提供自啟動以來儲存在日誌中的消息,
journalctl
用於讀取它們並將logger
它們提供給 rsyslog。也許像這樣簡單的東西可以工作:journalctl -b | logger -u /run/systemd/journal/syslog
雖然可能
logger
會嘗試向消息添加日期和標籤,最終效果可能看起來與轉發的消息不同……也許您可能需要比 更原始或更底層的東西logger
,或者重新格式化journalctl
輸出,使其格式為 rsyslog會明白…這個解決方案有一個競爭條件,因為在這個初始提要和 journald 的轉發之間很可能一些消息會失去(或重複)。
讓imjournal工作絕對是一個更好的解決方案。我很好奇為什麼它不能提供,畢竟 systemd 和 rsyslog 軟體都是為你的設備編譯和建構的,所以至少在技術上也可以建構 imjournal 模式……也許有涉及一些交叉編譯,這可能會給連結到 systemd 庫帶來挑戰,但我確信這是一個可以解決的問題,所以也許考慮問一個問題來讓它工作。
要考慮的另一個可能的解決方案是使用本機日誌遠端協議(而不是 syslog 協議和守護程序)來集中您的日誌。
有systemd-journal-remote,您可以在遠端主機上以“接收器”模式執行,以接收來自嵌入式設備的條目,並將它們保存在本地。還有systemd-journal-upload,您可以在嵌入式設備上執行它來將日誌數據推送到遠端主機。
這應該既保留早期啟動的消息,又保留所有元數據,因為不必將消息轉換為 syslog 格式。它還具有您不需要在嵌入式設備上保留本地執行的 rsyslog 守護程序的優點。
(日誌還支持“拉”模型,您可以在嵌入式設備上執行systemd-journal-gatewayd並配置 systemd-journal-remote 以從中提取。)