我有一个可以将信息写入 stdout 和 stderr 的 Linux 程序。
我有一个 shell 脚本,它将输出重定向到 中的一个文件/var/log
。(通过>>
和2>&1
。)
有没有办法让该日志文件轮换?(最大大小,然后切换到其他文件,仅保留有限数量的文件)
我看到了一些关于该logrotate
程序的答案,听起来不错,但它们似乎也专注于内部生成日志文件和处理 HUP 信号的程序。有没有办法用基本的输出重定向脚本来实现这一点?
答案1
另外,您可以通过主要旨在维护大小上限、自动轮换的日志文件集的工具来传输输出,例如:
- 丹·伯恩斯坦的
multilog
来自 daemontools - 布鲁斯·冈特的
multilog
来自 daemontools-encore - Laurent Bercot 的
s6-log
来自 s6 - Gerrit Pape 的
svlogd
来自 runit - 韦恩·马歇尔的
tinylog
来自罪犯 - 我的
cyclog
从小吃
处理格式日志文件集的工具multilog
包括:
- Russ Allbery 的
multilog-watch
logrange
- 保罗·克莱默的
multilog-stamptail
- 我的
follow-log-directories
来自 nosh - 我的
export-to-rsyslog
来自 nosh
进一步阅读
- 乔纳森·德·博因·波拉德(2015年)。”日志记录“。daemontools 家族. 常见问题答案。
- 乔纳森·德·博因·波拉德(2016年)。本世纪不要使用
logrotate
或。newsyslog
. 常见问题答案。 - https://unix.stackexchange.com/a/326166/5132
答案2
rotatelogs
apache 附带的工具(在目录中bin
)(参见文档)从 stdin 获取输入,并在特定时间后轮换日志
答案3
我遇到了类似的问题并且最初放弃了 logrotate,但事实证明 logrotate 实际上可以很好地做到这一点,关键指令是“复制截断“。由于某种原因,这个术语没有出现在我进行的任何谷歌搜索中,所以我添加了这个答案来阐明如何在这种情况下使用它。
诀窍如下仅起作用如果重定向完成“>>“(附加)而不是“>“ (创造)。
配置文件(truncate.cfg):
/tmp/temp.log {
size 10M
copytruncate
rotate 4
maxage 100
}
测试程序(从不放弃文件)。您可以看到它填满磁盘,尽管删除日志文件似乎有效,但实际上不会释放磁盘上的任何空间:
cat /dev/urandom >> /tmp/temp.log
运行日志轮换:
logrotate truncate.cfg
答案4
我喜欢multilog
我的用例,但我的用例太过简单,以至于在我找到的文档/示例中没有非常简单地展示。这是一个简单的多日志旋转示例:
mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1
一些说明:
- 这会将日志转储到 /tmp/myapp/ 目录中
- s10000 代表 10,000 字节*
- n5 代表 5 个文件。*“当前”日志算作其中一个文件,因此这包括 4 个较旧的日志 +“当前”
- 这是根据 François Beausoleil 提供的示例改编的:http://blog.teksol.info/pages/daemontools/best-practices
- 我不明白很多选项 - 我请您参考各种文档来扩展这一点......
- 文档警告说:
"Note that running processor may block any program feeding input to multilog."
“处理器”是'!tai64nlocal'
命令的一部分
*对于许多应用来说,这些都不是长期使用的好选择。它们确实能让你比大圆木更快地观察到填充和旋转圆木的行为。
最后,如果需要,别忘了使用 nohup!使用 nohup,您不需要2>&1
(此处 s=10e6 和 n=30):
mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &
该命令应该可以帮助您开始。