logrotate prerotate 脚本仅针对第一个日志文件触发,而不是所有日志文件

logrotate prerotate 脚本仅针对第一个日志文件触发,而不是所有日志文件

我们正在使用预旋转脚本将服务器日志上传到 AWS 中的 S3 存储桶。以下是 logrotate 脚本:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0644 www-data adm
    sharedscripts
    prerotate
            if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                    run-parts /etc/logrotate.d/httpd-prerotate; \
            fi
            /usr/local/bin/upload_log_to_s3.sh $1
    endscript
    postrotate
            invoke-rc.d nginx rotate >/dev/null 2>&1
    endscript
}

nginx 目录有一个 ssl_access.log 文件和一个 access.log 文件(分别用于 https 和 http 流量)。我们需要这两个日志。logrotate -f但是,当我尝试使用配置文件运行时,我只看到正在处理的第一个日志 access.log。我希望 ssl_access.log 也能被上传,但脚本upload_log_to_s3.sh只运行一次,并且只获取 access.log 路径。我知道 ssl_access.log 文件正在轮换,因为当我使用 -v 运行 logrotate 时,它​​会给我以下输出,这更令人困惑:

empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  log does not need rotating
considering log /var/log/nginx/error.log
  log does not need rotating
considering log /var/log/nginx/ssl_access.log
  log needs rotating

我读到的所有内容都表明预旋转脚本会针对捕获的每个文件运行一次,/var/log/nginx/*.log但这不是我看到的行为。我是否遗漏了什么?

答案1

就像个傻瓜一样,我刚刚意识到我在 logrotate 配置中遗漏了sharedscripts,这几乎肯定是 prerotate 脚本只触发一次的原因。我不太确定为什么 access.log 是上传的文件(根据手册页,第一个参数更改为 glob,而不是第一个找到的文件?)但至少我知道核心原因。

我在这里留下这个答案,以便其他人可以从我的错误中获益。

相关内容