由记录到标准输入的进程生成的轮换日志

Szt*_*upY 7 linux logging cronolog logrotate

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

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

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

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

chu*_*utz 6

来自 DJB 的daemontools 的Multilog可以(几乎)完全符合您的要求。我知道的唯一缺点是没有多少发行版带有daemontools包。

如果您没有使用svc(daemontools 的一部分)管理您的应用程序,您将必须找到一种方法将输出通过管道传输到类似的命令

multilog t s1048576 n100 ./my_log_directory
Run Code Online (Sandbox Code Playgroud)

这转化为:

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

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

有关更多信息,请查看链接。