我有一个长时间运行的进程,它将其日志文件写入stdout.我想将此输出保存到不同的文件,自动维护这些文件(如删除/存档旧文件),而无需重新启动主进程.
解决方案是将输出发送到文件(进程> log.txt),并在其上使用logrotate,但logrotate需要重新启动程序,这是不可能的.
另一个是将输出传递给cronolog(进程| cronolog),但在这种情况下,旧文件不会被删除/存档,这意味着我必须制作一个程序来为我做维护.
最好的方法是能够使用这两个实用程序,因为使用cronolog我不需要重新启动进程,而logrotate将完全按照我的意愿维护旧的日志文件.有没有办法让这两个程序相互协作?如果没有,这个问题的解决方案是什么?
解决方法
来自DJB
daemontools的
Multilog可以(几乎)完全按照你的要求做.我所知道的唯一缺点是没有多少发行版带有
daemontools的包.
如果您不使用svc(daemontools的一部分)管理应用程序,则必须找到一种方法将输出通过管道输出到命令
multilog t s1048576 n100 ./my_log_directory
这意味着:
> t:插入一个tai64n时间戳(可以转换为tai64nlocal的可读时间)
> s1048576:当日志文件增长到1MiB时将其旋转
> n100:保持不超过100个旋转文件
> ./my_log_directory:以…开头的任何内容.或/ – 将日志写入该目录
写入的日志将具有当前文件名,当多日志旋转日志时,它将重命名为@< tai64n timestamp> .s,其中文件名显示文件旋转的时间.如果文件是安全刷新的,则扩展名为.s;如果文件可能已被截断,则为.u.
有关详细信息,请查看链接.