Logging

由守護程序呼叫的前台程序是否應該根據嚴重性級別在 stderr 和 stdout 之間拆分日誌記錄?

  • September 8, 2014

通常日誌消息被寫入標準錯誤。我想知道拆分日誌消息是否是一個好主意/做法,以便錯誤和警告轉到標準錯誤,而調試/資訊/通知消息轉到標準輸出?或者這是無關緊要的,因為許多專用的日誌記錄程序只能從標準輸入中讀取,這需要將標準錯誤和標準輸出中的源日誌消息組合起來並重定向到記錄器的標準輸入。

$$ Update $$ 下面的兩個答案都提到了syslog,我想我需要詳細說明一下設置。

我問的守護程序自己在前台執行。守護程序是通過監督程序來管理的,例如runitsupervisord。在這兩種情況下,守護程序的 stderr 和 stdout 都將被監督程序擷取,而監督程序的工作是決定如何以及在何處儲存日誌(可能是 syslog,或者網路中通過 UDP 的其他地方) . 守護程序不必擔心寫入日誌的內容和位置,因為它們只需寫入 stdout/stderr。

在 的情況下runit,其日誌記錄工具svlogd將從其標準輸入中讀取重定向的日誌消息,這些消息是託管守護程序的標準錯誤/標準輸出的組合。至於supervisord,它可以將標準錯誤和標準輸出記錄到單獨的日誌文件中。

那麼在這個特定的設置中,在 stderr 和 stdout 之間拆分日誌是一個好習慣,還是只寫入其中一個?

我不建議你的程序中混合 stdout 和 stderr,但你如何在外面處理它取決於你。stdout旨在用於管道的已處理數據,而stderr專門用於非數據消息。這使得某些行為成為可能,例如批處理,而不改變現有的互動行為。你的情況不同 - stdout 很有可能意味著什麼。

因為runit對通過 進行日誌記錄的方式略有不同svlog,並且您正在編寫的服務很可能不會守護程序(在這種情況下,這意味著“從 tty 分離”),所以如果您想將所有內容擷取到一個單一的,這將取決於您通過/etc/sv/<servicename>/run腳本記錄或不記錄。大多數情況下,大多數執行腳本使用

exec 2>&1 

將兩個流融合在一起,因為大多數服務不通過標準輸出傳遞數據。如果您確實想使用svlog,則需要/etc/sv/<servicename>/log/run使用適當的命令創建一個腳本來啟動它。它可能看起來類似(但不完全類似):

#!/bin/sh
exec 2>&1
exec svlog -tt main

哪裡main是日誌目錄的符號連結。

引用自:https://serverfault.com/questions/486370