logrotate需通过postrotate段调用上传脚本实现轮转后立即上传;nocompress仅禁用压缩,不触发动作;上传目标为刚生成的明文归档文件(如app.log.1),须在postrotate中用ls -t取最新文件并执行脚本。

Logrotate 本身不支持在轮转后直接执行自定义脚本(如上传到云存储),nocompress 只是禁用压缩,并不能触发后续动作。要实现“切分后立即上传”,必须借助 postrotate / endscript 段落,配合你自己的上传脚本。
1. 理解 nocompress 的作用和误区
nocompress 只是让 logrotate 不对旧日志调用 gzip/bzip2 —— 它不会跳过轮转、也不会改变执行顺序。轮转完成后,旧日志文件(如 /var/log/app.log.1)仍会存在且可读,这才是上传的时机。
- 轮转过程:app.log → app.log.1(nocompress 下保持明文)→ app.log 新建
- 上传目标就是刚生成的
app.log.1这类归档文件 - 必须在
postrotate中处理,确保文件已落盘、句柄已关闭
2. 配置 logrotate 启用 postrotate 上传
在你的 logrotate 配置(如 /etc/logrotate.d/myapp)中写入:
/var/log/app.log {
daily
missingok
rotate 7
nocompress
copytruncate
postrotate
# 确保只上传本次轮转产生的最新归档(避免重复)
LATEST=$(ls -t /var/log/app.log.[0-9]* 2>/dev/null | head -n1)
if [ -n "$LATEST" ]; then
/usr/local/bin/upload-to-cloud.sh "$LATEST"
fi
endscript
}-
copytruncate适合正在写入的日志,避免服务中断 -
postrotate在轮转完成、新日志开始写入前执行,此时.1文件已就绪 - 用
ls -t取最新归档,防止并发或延迟导致误传
3. 编写可靠的上传脚本 upload-to-cloud.sh
脚本需具备幂等性、错误反馈和基础日志记录:
#!/bin/bash
LOG_FILE="$1"
if [ ! -f "$LOG_FILE" ]; then
logger -t logrotate-upload "Skip: $LOG_FILE not found"
exit 0
fi
<h1>示例:上传到阿里云 OSS(使用 ossutil)</h1><p>/usr/bin/ossutil64 cp "$LOG_FILE" oss://my-bucket/logs/$(basename "$LOG_FILE") --force \
&& rm -f "$LOG_FILE" \
&& logger -t logrotate-upload "Uploaded and removed: $(basename "$LOG_FILE")" \
|| logger -t logrotate-upload "Upload failed: $(basename "$LOG_FILE")"
- 务必加
#!/bin/bash和完整路径(logrotate 默认 PATH 很窄) - 上传成功后再
rm -f,避免残留;失败则保留供人工检查 - 用
logger记录到 syslog,便于排查(journalctl -t logrotate-upload)
4. 注意权限与环境隔离
logrotate 默认以 root 运行,但你的云工具(如 ossutil、aws cli、rclone)可能依赖用户级配置(~/.ossutilconfig)或密钥文件:
- 把认证凭据放在系统级位置,例如
/etc/ossutilconfig,并在脚本中指定--config-file /etc/ossutilconfig - 测试脚本时,用
sudo -u root /usr/local/bin/upload-to-cloud.sh /var/log/app.log.1模拟真实环境 - 避免在脚本中硬编码密钥;优先使用 IAM Role(云服务器)、配置文件或 secret manager
不复杂但容易忽略:nocompress 是前提,postrotate 是入口,上传脚本是核心,权限和路径是成败关键。


















