檢測程序是否應記錄到 systemd 日誌或標準輸出

檢測程序是否應記錄到 systemd 日誌或標準輸出

我正在更新一套適用於 RHEL7 的程序,其中一些, 一些。如果它們作為 systemd 服務啟動,我希望它們寫入 systemd 日誌。如果它們直接在終端機運行,例如為了測試,我希望它們寫入標準輸出。我怎樣才能最優雅地做到這一點?

我想利用日誌的高級功能——記錄嚴重性、文件名、行號、線程名稱等——所以簡單地寫入標準輸出是不夠的。

我所做的搜尋得到了檢查進程的父 PID 或檢查其 cgroup 的建議。有沒有更好的辦法?這些看起來像是笨拙的解決方案。理想情況下,有一個我可以呼叫的函數,或是要檢查的環境變數。

附加資訊:

(我的後備計劃是使用命令列開關,但自動檢測肯定會很好。)

答案1

在 systemd 版本 231 中,JOURNAL_STREAM為此目的引入了環境變數。您的程式檢查其值,將其值與其標準錯誤的裝置和 i 節點號進行比較,並相應地變更其行為。

什麼時候不是連接到日誌後,您(當然)可以始終使用諸如 JSON 之類的東西(每個物件一行)寫入標準錯誤,以便在那裡也有結構化日誌記錄。 RFC 5424 還具有(更有限的)結構化資料選項。

答案2

systemd已經為您優雅地處理了這種情況,如中所述系統執行程式

登入標準輸出。當透過 systemd 運行時,systemd 將預設將 STDOUT 重新導向到日誌。

另一個選擇是journal+console如果您總是想同時登入兩者。

記錄到 STDOUT 也是一種最佳實踐12 要素應用程式設計

相關內容