Mir*_*ral 68 linux redirection shell-script stdout logrotate
我有一个 Linux 程序,它可以将信息写入 stdout 和 stderr。
我有一个 shell 脚本,可以将该输出重定向到/var/log. (通过>>和2>&1。)
有没有办法让日志文件轮换?(最大大小,然后切换到不同的文件,只保留有限数量的文件)
我看过一些谈论该logrotate程序的答案,听起来不错,但它们似乎也专注于在内部生成日志文件并处理 HUP 信号的程序。有没有办法使用基本的输出重定向脚本来完成这项工作?
Jde*_*eBP 57
作为替代方案,您可以通过旨在维护大小上限、自动轮换的日志文件集的主要目的而设计的工具来管道输出,例如:
multilog来自 daemontoolsmultilog来自 daemontools-encores6-log来自 s6svlogd来自 runittinylog来自 perpcyclog从小吃然后处理multilog-format 日志文件集的工具包括:
multilog-watchlograngemultilog-stamptailfollow-log-directories从小吃export-to-rsyslog从小吃logrotate或newsyslog在本世纪。. 经常给出答案。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)
Lar*_*gan 14
如果您可以将它转到标准日志流之一(系统日志、守护进程、cron、用户、安全、邮件等),您可以使用logger命令和管道来代替它。
echo "Hello." | logger -p daemon.info
Run Code Online (Sandbox Code Playgroud)
否则,您最好将记录的内容传送到自定义程序或脚本来处理它,或者查看设置logrotate配置。
编辑:JdeBP 的答案似乎有您可能正在寻找的内容。
我喜欢multilog我的用例,但我的用例是如此琐碎/简单,以至于我找到的文档/示例中的布局并不是非常简单。这是一个简单的多日志轮换示例:
mkdir /tmp/myapp\n./myapp | multilog t s10000 n5 \'!tai64nlocal\' /tmp/myapp 2>&1\nRun Code Online (Sandbox Code Playgroud)\n\n一些注意事项:
\n\n"Note that running processor may block any program feeding input to multilog."其中“processor”是\'!tai64nlocal\'命令的一部分*对于许多应用来说,这些对于长期使用来说都是糟糕的选择。它们确实允许您比大型原木更快地观察填充和旋转原木的行为。
\n\n最后,如果需要的话,不要忘记 nohup !使用 nohup,您不需要2>&1(此处 s=10e6 且 n=30):
mkdir -p /tmp/myapp\nnohup ./myapp | multilog t s10000000 n30 \'!tai64nlocal\' /tmp/myapp &\nRun Code Online (Sandbox Code Playgroud)\n\n该命令应该可以帮助您开始。
\n| 归档时间: |
|
| 查看次数: |
46709 次 |
| 最近记录: |