标准输出的日志轮换?

Mir*_*ral 68 linux redirection shell-script stdout logrotate

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

我有一个 shell 脚本,可以将该输出重定向到/var/log. (通过>>2>&1。)

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

我看过一些谈论该logrotate程序的答案,听起来不错,但它们似乎也专注于在内部生成日志文件并处理 HUP 信号的程序。有没有办法使用基本的输出重定向脚本来完成这项工作?

Jde*_*eBP 57

作为替代方案,您可以通过旨在维护大小上限、自动轮换的日志文件集的主要目的而设计的工具来管道输出,例如:

然后处理multilog-format 日志文件集的工具包括:

进一步阅读

  • 谢谢,`multilog` 看起来正是我需要的。 (2认同)

小智 18

rotatelogsapache 附带的工具(在bin目录中)(参见文档)从 stdin 获取输入并在特定时间后轮换日志


Sam*_*ley 15

我遇到了类似的问题,最初丢弃了 logrotate,但事实证明 logrotate 实际上可以很好地做到这一点,关键指令是“ copytruncate ”。出于某种原因,该术语没有出现在我所做的任何谷歌搜索中,所以我添加了这个答案来明确说明如何在这种情况下使用它。

诀窍是这在使用“ >> ”(追加)而不是“ > ”(创建)完成重定向时才有效

配置文件(truncate.cfg):

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}
Run Code Online (Sandbox Code Playgroud)

测试程序(永不放弃文件)。您可以观察它填充磁盘,虽然删除日志文件似乎可以工作,但实际上并不会释放磁盘上的任何空间:

cat /dev/urandom >> /tmp/temp.log
Run Code Online (Sandbox Code Playgroud)

运行日志轮换:

logrotate truncate.cfg
Run Code Online (Sandbox Code Playgroud)

  • 刚刚在这里测试,它似乎有效。文件内容被复制到新的日志文件。原始文件由进程保持打开状态并被截断(大小现在显示为 0)。 (2认同)

Lar*_*gan 14

如果您可以将它转到标准日志流之一(系统日志、守护进程、cron、用户、安全、邮件等),您可以使用logger命令和管道来代替它。

echo "Hello." | logger -p daemon.info
Run Code Online (Sandbox Code Playgroud)

否则,您最好将记录的内容传送到自定义程序或脚本来处理它,或者查看设置logrotate配置。

编辑:JdeBP 的答案似乎有您可能正在寻找的内容。

  • +1 为简单起见。顺便说一句,您还可以配置自定义工具(local0)而不是标准工具(示例中的守护程序) (2认同)

sag*_*age 5

我喜欢multilog我的用例,但我的用例是如此琐碎/简单,以至于我找到的文档/示例中的布局并不是非常简单。这是一个简单的多日志轮换示例:

\n\n
mkdir /tmp/myapp\n./myapp | multilog t s10000 n5 \'!tai64nlocal\' /tmp/myapp 2>&1\n
Run Code Online (Sandbox Code Playgroud)\n\n

一些注意事项:

\n\n
    \n
  • 这会将日志转储到 /tmp/myapp/ 目录中
  • \n
  • s10000 代表 10,000 字节*
  • \n
  • n5 代表 5 个文件。* \'current\' 日志算作文件之一,因此这包括 4 个较旧的日志 + \'current\'
  • \n
  • 这是基于 Fran\xc3\xa7ois Beausoleil 提供的示例改编的:http://blog.teksol.info/pages/daemontools/best-practices
  • \n
  • 我不明白很多选项 - 我建议您参考各种文档来扩展此...
  • \n
  • 文档警告:"Note that running processor may block any program feeding input to multilog."其中“processor”是\'!tai64nlocal\'命令的一部分
  • \n
\n\n

*对于许多应用来说,这些对于长期使用来说都是糟糕的选择。它们确实允许您比大型原木更快地观察填充和旋转原木的行为。

\n\n

最后,如果需要的话,不要忘记 nohup !使用 nohup,您不需要2>&1(此处 s=10e6 且 n=30):

\n\n
mkdir -p /tmp/myapp\nnohup ./myapp | multilog t s10000000 n30 \'!tai64nlocal\' /tmp/myapp &\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n