Bash
Systemd 日誌文件前置時間戳
我有一個記錄到文件的 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]'
但日誌輸出看起來仍然一樣。
如何將時間戳添加到日誌文件
StandardOutput
和StandardError
日誌文件中的每一行?
ExecStart參數不支持完整的 shell 功能。請參閱該頁面的命令行部分中的此描述:
這種語法是受shell語法啟發的,但只理解後面幾段描述的元字元和擴展,變數的擴展是不同的。具體來說,不支持使用“<”、“<<”、“>”和“>>”進行重定向、使用“|”進行管道、使用“&”在後台執行程序以及其他 shell 語法元素。
(我的重點)
呼叫包裝外殼來完成這項工作:
ExecStart=/bin/bash -c "/path/to/my_service 2> >(/usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]' >&2) | /usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]'"
在這裡,我們將 stderr 重定向到執行
ts
時間戳並將其輸出重定向到 stderr 的程序替換(需要 bash),以便 systemd 的 StandardError 擷取它。原始命令的標準輸出通過管道傳輸ts
並發送到標準輸出以供 systemd 的 StandardOutput 擷取。