Logrotate成功,原始文件恢复原始大小

有没有人有任何问题之前使用logrotate导致日志文件旋转,然后回到原来的大小? 这是我的发现:

Logrotate脚本:

 /var/log/mylogfile.log {
    旋转7
    日常
    压缩
     olddir / log_archives
     missingok
     notifempty
     copytruncate
 }

Logrotate的详细输出:

将/var/log/mylogfile.log复制到/log_archives/mylogfile.log.1
截断/var/log/mylogfile.log
使用/ bin / gzip压缩日志
删除旧的日志/log_archives/mylogfile.log.8.gz

截断发生后的日志文件

 [root @ server〜]#ls -lh /var/log/mylogfile.log
 -rw-rw-r-- 1 part1 part1 0 Jan 11 17:32 /var/log/mylogfile.log

字面上秒以后:

 [root @ server〜]#ls -lh /var/log/mylogfile.log
 -rw-rw-r-- 1 part1 part1 3.5G Jan 11 17:32 /var/log/mylogfile.log

RHEL版本:

 [root @ server〜]#cat / etc / redhat-release 
红帽企业Linux ES第四版(Nahant Update 4)

Logrotate版本:

 [root @ DAA21529WWW370〜]#rpm -qa |  grep logrotate
日志轮播,3.7.1-10.RHEL4

几个注释:

  • 服务无法在运行中重新启动,所以这就是为什么我使用copytruncate
  • 根据每天晚上在其中olddir日志文件的olddir目录,日志每晚都在旋转。

这可能是因为即使截断了文件,写入文件的过程也会继续写在最后一个偏移量上。 所以发生了什么是logrotate截断文件,大小为零,处理再次写入文件,继续在它偏离它的偏移量,你现在有一个NULL字节的文件,直到截断它加上新的写入日志的条目。

od -c截断后+突然增长,产生的输出沿线:

 0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 33255657600 \0 CKB - server [ htt 33255657620 <more log output> 

这说的是从0到33255657600的偏移量,你的文件由空字节组成,然后是一些清晰的数据。 到达这个状态并不需要花费相同的时间来真正写入所有这些空字节。 ext {2,3,4}文件系统支持一些称为稀疏文件的文件,所以如果你寻找一个不包含任何东西的文件区域,那么这个区域将被认为包含空字节,并且不会占用空间在磁盘上。 那些空字节实际上不会被写入,只是假定在那里,因此花费0到3.5GB的时间不需要太多的时间。 (您可以通过执行像dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1这样的事情来testing所花费的时间量dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1 ,这会在几毫秒内生成超过3GB的文件。

如果在日志文件被截断并且再次突然增长之后运行ls -ls ,现在应该在行的开头报告一个代表实际大小的数字(占用磁盘的块),这可能是比ls -l报告的尺寸小几个数量级。

非常有信心,Kjetil已经击中了它。 德鲁,你可能还没有相信他的解释,但我敦促你仔细阅读他所说的话。

如果您接受它,则修复方法是在日志旋转时停止并重新启动应用程序,或者使用类似apache的“rotatelogs”这样的工具,通过pipe道将日志输出提供给工具,然后该工具负责每隔一段时间旋转日志文件。 例如,我的一个Apache实例logging

 ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800" 

这导致了很多像名字一样的日志文件

 -rw-r--r-- 1 root root 4078 Dec 21 01:04 error_log.1292457600 -rw-r--r-- 1 root root 4472 Dec 29 08:41 error_log.1293062400 -rw-r--r-- 1 root root 78630 Jan 4 12:57 error_log.1293667200 -rw-r--r-- 1 root root 15753 Jan 12 01:10 error_log.1294272000 

在不重启apache的情况下出现; 事后我可以手动压缩它们。 请注意,每周轮换的时间是604800秒,即传递给rotatelogs的参数。

如果你不能停止和重新启动应用程序,并且不能通过pipe道login,那么我认为你有一个真正的问题。 也许别人会有build议。

如果你能发送整个logrotate,那将是非常好的。

为什么要使用kill -HUP? (古典重装不重启 )的方法。

另外…检查谁正在访问该文件的lsof

只要使用“>>”这意味着追加而不是“>”这意味着创build从你的脚本写入这个文件。 我有完全相同的问题,我使用附加在我的脚本中修复它。

SomeScript.sh >> output.txt

希望更清楚。