我有一个长时间运行的进程,它将日志文件写入stdout
。我想将此输出保存到不同的文件,自动维护这些文件(如删除/存档旧文件),而无需重新启动主进程。
解决方案是将输出发送到文件(process > log.txt
),然后logrotate
在其上使用,但logrotate
需要重新启动程序,这是不可能的。
另一个方法是将输出通过管道传输到cronolog
(process | 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
是否已被截断。
欲了解更多信息,请查看链接。