Logrotate:使用旋转文件运行 postrotate 脚本

Dan*_*iel 6 linux logrotate

我正在使用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上运行脚本吗?

Jef*_*ler 2

据我了解,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)