有什么方法可以保持日志文件的文件大小固定,而无需通过新的空文件旋转并删除(或归档)旧文件。例如,如果我将日志文件的最大大小设置为1MB,则在文件大小增加到该限制之后,它将被自动钳制,然后在“ tail”上添加文本,并弹出最旧的文本部分以保持文件大小为1MB 。
有什么方法可以保持日志文件的文件大小固定,而无需通过新的空文件旋转并删除(或归档)旧文件。例如,如果我将日志文件的最大大小设置为1MB,则在文件大小增加到该限制之后,它将被自动钳制,然后在“ tail”上添加文本,并弹出最旧的文本部分以保持文件大小为1MB 。
Answers:
您可以编写一些bash脚本来执行此操作。只需使用尾部文件至特定字节数tail -c
并覆盖文件即可。
来自man tail
:
-c, --bytes=N
output the last N bytes; alternatively, use +N to output bytes
starting with the Nth of each file
If the first character of N (the number of bytes or lines) is a `+',
print beginning with the Nth item from the start of each file, other‐
wise, print the last N items in the file. N may have a multiplier suf‐
fix: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB
1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
您可以使用FIFO做类似的事情,它有点像一个零字节大小的文件。
但是,请注意,如果没有从该文件读取任何内容,则syslog进程可能会被阻塞,并且将停止写入所有日志文件。我不确定在较新版本的Ubuntu / CentOS中是否已更改此行为。
这里的一个例子
再举一个例子,尝试这样的事情。
使您的FIFO:
sudo mkfifo /var/log/everything.fifo
并将其添加到(r)syslog.conf中,然后重新启动syslog:
*.* |/var/log/everything.fifo
然后从一个窗口查看FIFO:
cat /var/log/everything.fifo
然后在另一个窗口中,向syslog发送一些信息:
logger Test1
logger Test2
logger Test3
您应该在cat
上面的输出中看到“ Test *”行。
此功能非常适合调试,尤其是当您不希望将数据保留更长的时间时。例如,如果您只想查看防火墙垃圾邮件以外的所有内容,则可以执行以下操作:
grep -vi "kernel: .* on wan" /var/log/everything.fifo
这是我的第二个答案。这是一个非常骇人听闻的东西。
使用watch(1)重复执行tail --bytes=1024
(日志文件的最后1024个字节,这要归功于@jjclarkson)。
watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch
然后使用以下命令查看文件:
less --raw-control-chars /tmp/messages.watch
watch
和while循环之间的区别在于,watch
如果/ var / log / messages发生更改,则只会更新/tmp/messages.watch。
while true; do
tail --bytes=1024 /var/log/messages > /tmp/messages.watch
sleep 1
done
好吧,我想您可以test
在while循环中放置一个代码,以便仅在更新/ var / log / messages时执行tail,但是现在我不知道了。
*修剪-剪切掉文件中描述的文件列表的顶部 *文件/ etc / default / prune。设计为定期运行 *来自cron的想法是自动缩短日志 *文件永远增长。该文件包含以下内容的列表 *文件(完整路径名),以及该文件的块数 *应保留。为了保持理智,修剪会 *在下一个换行符之后剪切文件。文件 * / etc / default / prune应该类似于: * * / usr / adm / aculog 10 * /usr/adm/leo.log 5 * / usr / adm / messages 200 * / usr / adm / sup_log 5 * * infoswx上用于修剪的crontab条目如下所示: * * 0 5 * * * / etc / prune> /usr/adm/prune.log 2>&1 * *编译为:cc -O -o prune prune.c * *以下定义可能会根据您的口味进行调整 *和您的系统块大小。 * *雷戴维斯infoswx!bees 09/25/85
如果发送了HUP信号(例如,通过运行prune的同一cron作业),许多(大多数?全部?)守护程序将重新打开其日志文件。
我敢肯定,原始海报在8年后就找到了解决方案。这是供其他人阅读的另一个主题...
缩减限制了程序输出的大小,并使用以下命令保留了最后200MB的输出:
run_program | 缩减-s 200M myprogram.log
rm -f *.tar.gz.*