日志旋转日期格式不支持毫秒扩展



我正在使用logrotate。它适用于dateformat %s并在somefile.log.1555267419.gz中生成文件。但是我需要以毫秒日期格式(somefile.log.1555267419789.gz)添加扩展名。

我检查了手册页,据我了解,它说它不支持毫秒说明符。

有没有办法在扩展中添加毫秒并仍然能够轮换旧的日志文件?

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

正如你已经提到的,logrotate 文档没有提到支持毫秒。您可以使用%s获取纪元时间,假设系统时钟已超过 2001 年 9 月 9 日。

日期格式 format_string

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

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

/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"

最新更新