Systemd 日志到文件前置时间戳

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]'

但日志输出看起来仍然相同。

如何在日志文件StandardOutputStandardError日志文件的每一行前面添加时间戳?

答案1

执行启动参数不支持完整的 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 重定向到一个进程替换(需要 bash),该进程替换执行时间戳ts并将其输出重定向到 stderr,以便 systemd 的 StandardError 捕获它。原始命令的 stdout 通过管道传输并发ts送到 stdout,以供 systemd 的 StandardOutput 捕获。

相关内容