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

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

我正在使用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
}

我明白了

/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

通常,日志文件的绝对路径作为第一个参数传递给脚本,最终旋转日志文件的绝对路径作为第二个参数传递给脚本。

我认为你只需要检查第二个参数。

相关内容