如何将 systemd 服务的标准输出和错误连接到路径中带有日期的文件?

如何将 systemd 服务的标准输出和错误连接到路径中带有日期的文件?

我想在 systemd 下运行一个服务器进程,并将其标准输出和错误附加到一个文件中,其中文件路径中包含日期,如下所示:

/initech/logs/tps-report-app/sales/2023/09/11/console.log

理想情况下,我希望该路径能够在日期改变时自动滚动,但如果没有,这也并不是世界末日,因为我们无论如何都会在一夜之间重启服务器。

我不想做的一件事是进行传统的日志轮换,其中输出被写入具有固定路径的文件中,然后稍后轮换到具有日期路径的文件中。

StandardOutput 配置选项让我使用 附加输出到文件append:path,但该字符串中没有提到变量替换,因此我认为必须修复它。有没有办法将日期合并到此路径中?

如果没有,这里最好的方法是什么?通过命名管道或类似的东西将输出连接到 multilog 之类的日志守护进程?systemd“工具包”中是否有类似的东西?使用链式加载器类型的脚本包装服务器进程,该脚本重定向标准输出和错误?还有其他方法吗?

答案1

例如,您可以使用 每天滚动日志。您可以告诉软件将日志发送到 /path/$(something-bashy here)/console.log 并作为创建路径的一部分,然后重新启动相关服务,而不是logrotate使用。StandardOutputpostrotate

编辑:刚刚注意到您提到服务器每晚都会重新启动。那么您唯一要担心的就是确保日志文件路径存在。在这种情况下,我会将日志文件路径的创建合并到 中ExecStart。类似

ExecStart=/bin/bash -ac \
  "mkdir /my/path -p && run_app.sh"

相关内容