Logrotate脚本未运行

问题描述 投票:3回答:3

我有以下logrotate脚本

/path/to/folder {
   daily
   rotate 30
   notifempty
   sharedscripts
   copytruncate
   compress
   dateext


   preremove
     if file --mime-type "$1" | grep -q gzip$; then
          mkdir -p /path/to/archive/folder && cp $1 $_
     fi
   endscript
}

  • 我想要实现的目标: - 在保留30天后删除日志文件之前,请复制到另一个文件夹。

我在调试模式下运行此logstash配置

logrotate -d $CONFIG_FILE

通过日志的外观,旋转工作正常,但它甚至没有运行preremove脚本。我还没有在现场运行这个配置,因为我想在这之前测试它。

logrotate版本3.8.6

linux bash unix logging logrotate
3个回答
1
投票

我不确定你是否在问为什么preremove没有运行,或者你的脚本是否正常。

Preremove, and how to test

我不相信logrotate会运行preremove脚本,如果它不删除文件(根据-d)。我设置了一个测试用例并在strace下运行它。 logrotate -d找到了需要删除的文件并写道它会删除它们,但没有运行preremove代码。老实说,这对我来说是有意义的,也是我所期待的,因为preremove可能会像删除本身一样具有破坏性。

为了执行测试,我认为您需要在另一个目录中重现您的实时环境,并实际运行它。不要使用完整大小的文件,只需使用几行虚拟文件。创建一个脚本来构建测试文件夹,以便您可以轻松地重现测试。使用touch设置时间戳。例如:

for n in $(seq 1 30); do
    cp test.log test.log.$n
    gzip test.log.$n
    touch -d "now - $n day" test.log.$n.gz
done

The script itself

  • grep -q gzip$错了。 $将在shell解析中消失。您需要将其括在单引号中。
  • 正如别人写的那样,我不希望$_工作。重复目录名称,或在脚本中使用变量。
  • 据我所知,我认为你不需要在EOL逃脱\
  • 你可能想要cp -p,正如有人建议的那样。
  • 如果你的文件很大,cp会很慢。如果您的存档位于同一文件系统中,请考虑使用ln(而不是ln -s!)。这将是即时的。
  • 使用file --mime-type可能工作正常,但坦率地说,在这种情况下,我只是将其基于文件名,因为logrotate会在.gz将返回file的任何文件上可靠地附加gzipexpr "$1" : '.*gz$'将为$1结尾的任何.gz提供非零数字作为标准输出。它将精确地给出数字0作为不以.gz结尾的文件名的标准输出。

0
投票

我认为你的条件本身不会成真,你可以在preremove调试之前把它放回去。尝试手动执行if条件并查看。

# file --mime-type * | grep -i *.1
audit.log.1: text/plain
# file --mime-type * | grep -i *.1$
# file --mime-type * | grep -q *.1$
# file --mime-type * | grep -q *.1

0
投票

你可能会错过some examples中看到的行继续转义

preremove
    # debug line
    systemd-cat -t "rot-pre-rm" echo "preremove block, file: $1"
    if file --mime-type "$1" | grep -q gzip$; then \
        cp -p "$1" /path/to/archive/syslog/; \
    fi; \
endscript
© www.soinside.com 2019 - 2024. All rights reserved.