我正在使用logrotatewith轮换日志文件copytruncate,我需要运行一个以新文件名作为参数的脚本。我知道我可以使用$1inside postrotate,但这给了我旋转文件的名称 - 而不是带有日期扩展名的文件。
所以基本上我有:
/var/log/myapp/server.log
当我运行这个 logrotate 配置时:
/var/log/myapp/server.log {
copytruncate
rotate 1008
dateext
dateformat -%s
create 660 syslog syslog
postrotate
python3 /opt/myapp/test.py $1 > /dev/null
endscript
}
Run Code Online (Sandbox Code Playgroud)
我得到
/var/log/myapp/server.log <-- (now empty)
/var/log/myapp/server.log-1536844088
Run Code Online (Sandbox Code Playgroud)
我可以以/var/log/myapp/server.log-1536844088某种方式在 postrotate上运行脚本吗?
据我了解,logrotate 会将日志文件的名称传递给postrotate;中的脚本。您可以使用脚本和第一个参数以及 logrotate 已使用日期格式创建旋转文件的知识-%s来生成这些文件的列表:
import sys
import fnmatch
import os
for file in os.listdir(os.path.dirname(sys.argv[1])):
if fnmatch.fnmatch(file, os.path.basename(sys.argv[1]) + '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'):
print(file)
Run Code Online (Sandbox Code Playgroud)
这是我的第一个 python 脚本,所以它可能不惯用,但希望能展示这个想法。fnmatch() 函数使用的 glob 应该可以覆盖您数年(直到 2286 年 11 月下旬),届时 9,999,999,999 秒将滚动到 10,000,000,000。您可以“扩大”该范围,使其“只”需要“10 位数字,然后是任何内容”:
...
if fnmatch.fnmatch(file, os.path.basename(sys.argv[1]) + '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*'):
...
Run Code Online (Sandbox Code Playgroud)