轮换由记录到 stdin 的进程生成的日志

轮换由记录到 stdin 的进程生成的日志

我有一个长时间运行的进程,它将日志文件写入stdout。我想将此输出保存到不同的文件,自动维护这些文件(如删除/存档旧文件),而无需重新启动主进程。

解决方案是将输出发送到文件(process > log.txt),然后logrotate在其上使用,但logrotate需要重新启动程序,这是不可能的。

另一个方法是将输出通过管道传输到cronologprocess | cronolog),但在这种情况下,旧文件不会被删除/存档,这意味着我必须制作一个程序来为我进行维护。

最好的办法是能够同时使用这两个实用程序,因为cronolog我不需要重新启动该过程,并且logrotate可以完全按照我的意愿维护旧日志文件。有没有办法让这两个程序相互协作?如果没有,有什么好办法可以解决这个问题?

答案1

多日志来自 DJB 的守护进程工具几乎可以完全满足您的要求。我所知道的唯一缺点是,没有多少发行版附带守护进程工具

如果你没有使用svc(daemontools 的一部分)来管理你的应用程序,那么你必须找到一种方法将输出传输到如下命令中

multilog t s1048576 n100 ./my_log_directory

这意味着:

  • t:插入 tai64n 时间戳(可以使用 转换为可读时间tai64nlocal
  • s1048576:当日志文件增长到 1MiB 时轮换它
  • n100:保留不超过 100 个轮换文件
  • ./my_log_directory: 以.或开头的任何内容/- 将日志写入该目录

写入的日志将具有文件名current,当 multilog 轮换日志时,它将被重命名,@<tai64n timestamp>.s文件名显示文件轮换的时间。扩展名可以是.s文件是否已安全刷新,或者.u是否已被截断。

欲了解更多信息,请查看链接。

更新:

日志服务运行是具有类似命令行用法的 multilog 的替代品。

s6-日志s6是另一个具有更多功能和兼容命令行使用的分支。

相关内容