有没有人有任何问题之前使用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
几个注释:
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
希望更清楚。