Arch-Linux

如何將某些單元的日誌輸出定向到特定文件?

  • May 23, 2021

我有一個執行多個守護程序(作為 systemd 單元)的系統,它們將日誌資訊輸出到 Arch Linux 中的日誌。我想將其中一些單元文件的日誌輸出定向到我指定的位置的單獨文本文件中,本質上是為單元子集創建一個日誌文件。我該怎麼做呢?

**更新:**對於較新的 systemd 版本(自 systemd 236 起),這實際上是可能的。有關StandardOutputStandardError節,請參見systemd.exec。這些支持以下選項,作為摘錄:

file:path選項可用於將特定文件系統對象連接到標準輸出。語義類似於 StandardInput= 的相同選項,見上文。如果 path 引用文件系統上的正常文件,則將其打開(如果尚不存在則創建)以在文件開頭寫入,但不會截斷它。如果標準輸入和輸出指向相同的文件路徑,則它只打開一次,用於讀取、寫入和複製。當指定的路徑引用文件系統中的 AF_UNIX 套接字時,這特別有用,因為在這種情況下,只會為輸入和輸出創建單個流連接。

append:path與上面的 file:path 類似,但它以追加模式打開文件。

截斷:路徑與上面的 file:path 類似,但在打開文件時會截斷文件。對於具有多個命令行的單元,例如具有多個 ExecStart= 的 Type=oneshot 服務,或具有 ExecCondition=、ExecStartPre= 或 ExecStartPost= 的服務,輸出文件會重新打開,因此會針對每個命令行重新截斷。如果輸出文件被截斷而另一個程序仍然打開文件,例如通過 ExecReload= 與 ExecStart= 同時執行,並且另一個程序繼續寫入文件而不調整其偏移量,則文件指針之間的空間兩個程序可以用 NUL 字節填充,產生一個稀疏文件。因此,truncate:path 通常只對一次只執行一個程序的單元有用,例如具有單個 ExecStart= 而沒有 ExecStartPost=、ExecReload=、ExecStop= 或類似的服務。

$$ … $$ fd:name選項將標準輸出連接到由套接字單元提供的特定命名文件描述符。名稱可以指定為該選項的一部分,跟在“:”字元之後(例如“fd:foobar”)。如果未指定名稱,則隱含名稱“stdout”(即“fd”等價於“fd:stdout”)。必須通過 Sockets= 選項提供至少一個定義指定名稱的套接字單元,並且文件描述符名稱可能與其包含的套接字單元的名稱不同。如果找到多個匹配項,將使用第一個匹配項。有關命名描述符及其排序的更多詳細資訊,請參閱 systemd.socket(5) 中的 FileDescriptorName=。

原答案:

上游似乎不可能和不需要(將stdout/stderr重定向到單個文件)參見例如http://lists.freedesktop.org/archives/systemd-devel/2012-March/004705.html-閱讀整個執行緒以獲取更多資訊上下文資訊這是如何工作的。

您可以做的是記錄到系統日誌,然後寫入單個文件。或者反過來說,如果單元呼叫了一些可以自己寫日誌的程序,那麼就用它來記錄到一個文件中。

您可能還想查看查看 systemd 服務的 stdout/stderr

您已經可以使用目前設置執行的操作是

journalctl -u yourunitname > yourlogfile_for_yourunitname

將單元“yourunitname”的整個日誌輸出定向到文件中。

在後面部分,您還應該查看來自上述郵件列表執行緒的 Lennart 的提示:

在最近的 systemd 版本中,類似的東西systemd-journalctl -o cat _SYSTEMD_UNIT=postgresql.service應該​​創建一個非常簡單的輸出,只包含實際消息而沒有其他內容。您甚至可以通過“-f”並使其生效。”

編輯: 實際上,對於較新的 systemd 版本,該命令只是journalctl並且據我所知,上述長命令journalctl -u yourunitname與您也可以-f在那裡“跟隨”輸出(如 tailf 或 tail -f)。

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