Bash

Systemd 日誌文件前置時間戳

  • December 22, 2021

我有一個記錄到文件的 systemd 服務:

[Unit]
Description=...

[Service]
ExecStart=/path/to/my_service
StandardOutput=append:/var/log/my_service/log.log
StandardError=append:/var/log/my_service/err_log.log

[Install]
WantedBy=multi-user.target

我想將目前時間戳添加到每一行,這可以在終端中使用以下ts命令moreutils實現:

/path/to/my_service | /usr/bin/ts '[%Y-%m-%d %H:%M:%S]'

我試過了:

ExecStart=/path/to/my_service | /usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]'

但日誌輸出看起來仍然一樣。

如何將時間戳添加到日誌文件StandardOutputStandardError日誌文件中的每一行?

ExecStart參數不支持完整的 shell 功能。請參閱該頁面的命令行部分中的此描述:

這種語法是受shell語法啟發的,但只理解後面幾段描述的元字元和擴展,變數的擴展是不同的。具體來說,不支持使用“<”、“<<”、“>”和“>>”進行重定向、使用“|”進行管道、使用“&”在後台執行程序以及其他 shell 語法元素。

(我的重點)

呼叫包裝外殼來完成這項工作:

ExecStart=/bin/bash -c "/path/to/my_service 2&gt; &gt;(/usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]' &gt;&2) | /usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]'"

在這裡,我們將 stderr 重定向到執行ts時間戳並將其輸出重定向到 stderr 的程序替換(需要 bash),以便 systemd 的 StandardError 擷取它。原始命令的標準輸出通過管道傳輸ts並發送到標準輸出以供 systemd 的 StandardOutput 擷取。

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