我们正在使用预旋转脚本将服务器日志上传到 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,而不是第一个找到的文件?)但至少我知道核心原因。
我在这里留下这个答案,以便其他人可以从我的错误中获益。