更改LogRotate旋转日志文件的默认方式

我对logrotation的观察是,按照以下顺序来旋转任何日志文件,即logrotate进程

  1. 使用新名称(将时间戳或数字添加到现有名称以使其成为file1.log-20140513)将有问题的日志文件(让我们称之为file1.log)复制,
  2. 删除现有文件(file1.log)并用原始名称(file1.log)创build一个新的空白日志文件,
  3. 压缩旋转文件(file1.log-20140513),该文件将创build一个新的压缩文件(file1.log-20140513.gz),如果设置了压缩选项,
  4. 删除轮转的文件(file1.log-20140513),最后,
  5. 移动到下一个文件上面执行相同的4个步骤。

我在这个过程中遇到以下问题:

  1. 我的日志文件是巨大的(每个超过10 GB),我有大约42个这样的日志文件。
  2. 写入这些文件的进程同步工作,
  3. 服务器上的DiskIO是好的,但是复制需要时间,压缩也需要时间,压缩也会消耗CPU。
  4. 我希望所有新创build的日志文件都具有从同一时间开始的日志。

要做到这一点,我想logrotate移动,mv命令所做的一些事情,它重命名文件,而不是复制它们。 至于压缩,我可以禁用,并通过不同的脚本通过计划通过cron触发它。 但我想logrotate移动文件,而不是复制它们。

现在,确定这是logrotate的作者也会考虑的一些事情,因为它明显地节省了磁盘IO和完成整个logrotate操作的时间,所以我想要为什么文件被复制而不是被移动或重命名,以及如何我是否通过logrotate来实现这一点?

注:我试图手动执行它,也就是移动正在运行的进程正在写入的文件,并创build一个具有相同名称和相同权限的新空白文件(即root,这也是进程的权限运行),但移动并创build一个新的文件后,我看到该进程没有写任何东西,所以不得不重新启动进程,使其写入该文件。 任何人也可以解释这种行为,为什么logrotatepipe理,使进程写入相同的文件,但我不能使用简单的步骤。

您所描述的行为只会在通过copytruncate指令明确告知logrotate时发生。 该文档警告可能会由于此行为而丢失一些日志数据。 该指令只能作为最后的手段使用。

旋转日志文件的标准方法是重命名,然后发送一个信号给进程,让它打开新的日志文件。 这是更快,不会冒失去部分日志的风险。 但是它要求写入过程能够切换到新的日志文件。

压缩可以被closures或推迟到下一次旋转。 如果使用compress指令,则旧的日志文件被压缩。 如果该指令未被使用,则不被压缩。

如果使用compressdelaycompress ,则压缩将延迟到下一次旋转。 这样在每次旋转之后,两个最新的日志文件还没有被压缩。

在移动并创build一个新文件之后,我看到这个进程并没有写任何东西,所以不得不重新启动这个进程来写入这个文件

进程正在写入相同的文件,这就是为什么lograte复制而不是移动。 当你删除日志时,进程仍然写入日志,你可以看到文件系统使用增长,但没有文件。 进程重启将释放磁盘空间。

考虑到

  • less写入日志,是所有logging信息必要?
  • 阅读文档,例如: http : //www.thegeekstuff.com/2010/07/logrotate-examples/