保持日志文件大小固定而不进行logrotate


13

有什么方法可以保持日志文件的文件大小固定,而无需通过新的空文件旋转并删除(或归档)旧文件。例如,如果我将日志文件的最大大小设置为1MB,则在文件大小增加到该限制之后,它将被自动钳制,然后在“ tail”上添加文本,并弹出最旧的文本部分以保持文件大小为1MB 。


使用logrotate,然后rm -f *.tar.gz.*
Marco Ceppi 2010年

1
有什么特殊的原因为什么您不想旋转日志或使用logrotate?你到底想发生什么?将旧日志归档为1M并开始新的日志?您问题的开头与结尾不太吻合。
David Thornley,2010年

是什么POP操作出来是什么意思?
tshepang 2011年

Answers:


4

您可以编写一些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.

3
我相对确定,一旦“覆盖文件”,日志记录将不会在新文件上自动恢复。
Stephen Jazdzewski 2010年

0

您唯一的解决方案可能是编写您自己的用户空间文件系统或对现有系统进行贡献。查看用户空间文件系统的部分列表

如果您没有贡献的技能,请提供项目宣传或$$或两者兼有,为您添加。

我希望我有时间去做,我一直想要这样的东西。


0

您可以使用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

0

这是我的第二个答案。这是一个非常骇人听闻的东西。

使用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,但是现在我不知道了。


0
 *修剪-剪切掉文件中描述的文件列表的顶部
 *文件/ 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

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=zh-CN&ie=UTF-8&q=prune+log+file&pli=1

如果发送了HUP信号(例如,通过运行prune的同一cron作业),许多(大多数?全部?)守护程序将重新打开其日志文件。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.