logrotate dateformat不支持毫秒扩展

时间:2019-04-14 18:38:43

标签: logrotate

我正在使用logrotate。它可以与dateformat %s一起正常工作,并在somefile.log.1555267419.gz中生成文件。但我需要以毫秒为单位添加扩展名dateformat(somefile.log.1555267419789.gz)。

我检查了联机帮助页,据我了解,它说它不支持毫秒说明符。

有什么方法可以增加毫秒数并且仍然能够旋转旧的日志文件吗?

/var/log/somelog/*.log {
   compress
   notifempty
   daily
   copytruncate
   size 15M
   dateext
   dateformat .%s
   rotate 20
}

1 个答案:

答案 0 :(得分:0)

正如您已经提到的,logrotate docs提到不支持毫秒。假设系统时钟已超过2001年9月9日,则可以使用%s获取EPOCH时间。

  

日期格式 format_string

     

使用类似于strftime(3)函数的符号为dateext指定扩展名。仅允许%Y%m%d和%s的说明符。默认值为-%Y%m%d。请注意,分隔日志名称和扩展名的字符也是dateformat字符串的一部分。必须将系统时钟设置为2001年9月9日之后,%s才能正常工作。请注意,此格式生成的日期戳必须可以按词法排序(即,首先是年份,然后是月份,然后是日期。例如,2001/12/01可以,但是01/12/2001不能,因为01/11 /) 2002年的排名会稍低一些,而晚些时候)。这是因为使用rotate选项时,logrotate对所有旋转的文件名进行排序,以找出哪些日志文件较旧,应将其删除。

但是,您可以尝试使用logrotate script手动设置毫秒级的EPOCH。在下面的示例中,您调用位于/my/script的自定义脚本,该脚本以旋转的文件名作为参数。在$1 / prerotate中使用postrotate,可以得到要旋转文件的绝对路径。您还希望使用nosharedscripts配置(默认设置),以确保每个prerotate模式匹配的日志文件都运行postrotate / *.log脚本。 / p>

/var/log/somelog/*.log {
   compress
   notifempty
   daily
   copytruncate
   size 15M
   dateext
   dateformat .%s
   rotate 20
   nosharedscripts
   postrotate
       /my/bash/script $1 > /dev/null
   endscript
}

然后在您的自定义脚本中,可以通过重命名来设置文件名的毫秒数。在Linux机器上以毫秒为单位获取EPOCH的一种方法是运行date "+%s%3N"