我正在更新一套適用於 RHEL7 的程序,其中一些由 小碼哥發佈於, 一些爪哇。如果它們作為 systemd 服務啟動,我希望它們寫入 systemd 日誌。如果它們直接在終端機運行,例如為了測試,我希望它們寫入標準輸出。我怎樣才能最優雅地做到這一點?
我想利用日誌的高級功能——記錄嚴重性、文件名、行號、線程名稱等——所以簡單地寫入標準輸出是不夠的。
我所做的搜尋得到了檢查進程的父 PID 或檢查其 cgroup 的建議。有沒有更好的辦法?這些看起來像是笨拙的解決方案。理想情況下,有一個我可以呼叫的函數,或是要檢查的環境變數。
附加資訊:
- 為了由 小碼哥發佈於我計劃調用的程序sd_journal_print(3)。
- 為了爪哇程式我打算使用SLF4J + Logback +logback日誌。
(我的後備計劃是使用命令列開關,但自動檢測肯定會很好。)
答案1
在 systemd 版本 231 中,JOURNAL_STREAM
為此目的引入了環境變數。您的程式檢查其值,將其值與其標準錯誤的裝置和 i 節點號進行比較,並相應地變更其行為。
什麼時候不是連接到日誌後,您(當然)可以始終使用諸如 JSON 之類的東西(每個物件一行)寫入標準錯誤,以便在那裡也有結構化日誌記錄。 RFC 5424 還具有(更有限的)結構化資料選項。
答案2
systemd
已經為您優雅地處理了這種情況,如中所述系統執行程式。
登入標準輸出。當透過 systemd 運行時,systemd 將預設將 STDOUT 重新導向到日誌。
另一個選擇是journal+console
如果您總是想同時登入兩者。
記錄到 STDOUT 也是一種最佳實踐12 要素應用程式設計。