![Logrotate:使用旋转文件运行 postrotate 脚本](https://linux22.com/image/140064/Logrotate%EF%BC%9A%E4%BD%BF%E7%94%A8%E6%97%8B%E8%BD%AC%E6%96%87%E4%BB%B6%E8%BF%90%E8%A1%8C%20postrotate%20%E8%84%9A%E6%9C%AC.png)
我正在使用logrotate
with轮换日志文件copytruncate
,并且需要使用新文件名作为参数运行脚本。我知道我可以使用$1
inside 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
}
我明白了
/var/log/myapp/server.log <-- (now empty)
/var/log/myapp/server.log-1536844088
我可以以某种方式在后旋转中运行脚本吗/var/log/myapp/server.log-1536844088
?
答案1
据我了解,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)
这是我的第一个 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]*'):
...
答案2
dateformat -%s
您可以向您的,例如,添加后缀 X
,然后您应该能够找到一个唯一的文件*X
,并在不带 X 的情况下重命名它之后,将其交给您的 python:
dateformat -%sX
postrotate
for f in *X; do mv "$f" "${f%X}" && test.py "${f%X}"; done
endscript
我用了一个for
循环来使它不那么脆弱。您可能需要检查此过程是否/bin/sh
正确。
答案3
postrotate
python3 /opt/myapp/test.py $1-`date '+%Y%m%d'` > /dev/null
endscript
只要它在同一天运行,它就有效。
答案4
从man logrotate
:
通常,日志文件的绝对路径作为第一个参数传递给脚本,最终旋转日志文件的绝对路径作为第二个参数传递给脚本。
我认为你只需要检查第二个参数。