有什么方法可以保持日志文件的文件大小固定,而不用新的空文件旋转它并删除(或归档)旧文件。例如,如果我将日志文件最大大小设置为 1MB,则在文件大小增加超过该限制后,它将自动夹紧,文本将添加到“tail”上,并弹出文本中最旧的部分,以保持文件大小为 1MB 。
答案1
您可以编写一个小 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.
答案2
我确信原发帖者在 8 年后已经找到了解决方案。这是其他可能阅读此主题的人的另一篇文章......
curtail 使用以下命令限制程序输出的大小并保留最后 200MB 的输出:
运行程序| curtail -s 200M myprogram.log
答案3
您唯一的解决方案可能是编写自己的用户空间文件系统或为现有的文件系统做出贡献。查看部分列表用户空间中的文件系统
如果您没有能力做出贡献,请提供项目宣传或 $$$ 或两者兼而有之,以便为您添加。
我希望我有时间去做,我一直想要这样的东西。
答案4
这是我的第二个答案。这是一个相当黑客的行为。
使用 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 ,但我现在不知道这一点。