进一步阅读

进一步阅读

我有一个可以将信息写入 stdout 和 stderr 的 Linux 程序。

我有一个 shell 脚本,它将输出重定向到 中的一个文件/var/log。(通过>>2>&1。)

有没有办法让该日志文件轮换?(最大大小,然后切换到其他文件,仅保留有限数量的文件)

我看到了一些关于该logrotate程序的答案,听起来不错,但它们似乎也专注于内部生成日志文件和处理 HUP 信号的程序。有没有办法用基本的输出重定向脚本来实现这一点?

答案1

另外,您可以通过主要旨在维护大小上限、自动轮换的日志文件集的工具来传输输出,例如:

处理格式日志文件集的工具multilog包括:

进一步阅读

答案2

rotatelogsapache 附带的工具(在目录中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 &

该命令应该可以帮助您开始。

相关内容