我正在使用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
}
答案 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"
。