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

dre*_*ard 14 linux redhat log-files logrotate

在导致日志文件旋转然后恢复到原来的大小之前,是否有人对 logrotate 有任何问题?这是我的发现:

日志旋转脚本:

/var/log/mylogfile.log {
    旋转 7
    日常的
    压缩
    olddir /log_archives
    错过了
    通知空
    复制截断
}

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 第 4 版(Nahant 更新 4)

日志旋转版本:

[root@DAA21529WWW370 ~]# rpm -qa | grep 对数旋转
logrotate-3.7.1-10.RHEL4

几点注意事项:

  • 服务无法即时重新启动,所以这就是我使用 copytruncate 的原因
  • 根据每晚olddir日志文件所在的目录,日志每晚都会轮换。

Kje*_*sen 20

这可能是因为即使您截断了文件,写入文件的进程仍将继续写入它最后的偏移量。所以发生的事情是 logrotate 截断文件,大小为零,进程再次写入文件,继续它离开的偏移量,现在你有一个空字节的文件,直到你截断它加上新的写入日志的条目。

od -c 截断 + 突然增长后,生成的输出如下:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>
Run Code Online (Sandbox Code Playgroud)

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

如果您ls -ls在日志文件被截断并再次突然增长后运行它们,它现在应该在行的开头报告一个数字,代表实际大小(以磁盘占用的块为单位),这可能是数量级小于 just 报告的大小ls -l

  • 问题不在于文件被截断的方式,问题在于程序如何写入日志文件。为了将日志文件截断为一种可行的方法,您必须让写入日志文件的程序以某种方式寻求位置 0。不支持稀疏文件的文件系统可能不会有这个问题,尽管我不知道现在没有任何方法可以测试。 (2认同)