将由日志logging到stdin的进程生成的日志进行轮换

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

解决的办法是将输出发送到一个文件( process > log.txt ),并使用logrotate ,但是logrotate需要重启程序,这是不可能的。

另一个是输出到cronologprocess | cronolog ),但在这种情况下,旧的文件不会被删除/存档,这意味着我必须做一个程序,将为我做的维护。

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

来自DJB的daemontools的multilog可以(几乎)正是你所要求的。 我知道唯一的缺点是没有多less发行版包含daemontools 。

如果你不是用svc (daemontools的一部分)来pipe理你的应用程序,你将不得不find一种方法来将输出传递给一个命令

 multilog t s1048576 n100 ./my_log_directory 

这转化为:

  • t :插入tai64n时间戳(可以用tai64nlocal翻译成可读时间)
  • s1048576 :日志文件增长到1MiB时,将其旋转
  • n100 :保存不超过100个旋转的文件
  • ./my_log_directory :任何以./ – 将日志写入该目录

写入的日志将具有current的文件名,当multilog旋转日志时,它将被重命名为@<tai64n timestamp>.s ,其中文件名显示文件被旋转的时间。 扩展名可以是.s如果文件被安全地刷新,或者.u如果它可能被截断。

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