Ubuntu Java日志备份方法
一 常用方案总览
- logrotate 本地轮转与压缩:系统自带、稳定可靠,适合大多数 Java 应用(含 nohup 输出和框架日志)。支持按天轮转、压缩、保留份数、按日期命名等。
- Shell 脚本 + cron 定时备份:灵活可控,适合需要自定义命名、异地拷贝或额外清理逻辑的场景。
- 应用内日志框架归档:在 Log4j2/Logback 中配置按时间/大小滚动,天然支持归档与保留策略。
- 集中式与云归档:用 rsyslog/ELK 做集中与检索,或将已轮转日志通过 S3cmd 上传至对象存储做长期留存。
二 方案一 Logrotate 本地轮转与压缩(推荐)
- 适用:日志文件持续增长、希望自动化轮转与清理、尽量不改动应用。
- 步骤:
- 创建配置(示例为单文件,也可用通配符处理多日志)
sudo tee /etc/logrotate.d/myapp <<‘EOF’
/opt/myapp/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
copytruncate
dateext
dateformat -%Y%m%d-%H%M%S
create 0644 appuser appgroup
}
EOF
- 关键参数说明
- daily/rotate 30/compress/delaycompress:按天轮转、保留 30 天、压缩旧日志(delaycompress 常用于避免压缩正在写入的文件)。
- missingok/notifempty:文件缺失不报错、空文件不轮转。
- copytruncate:复制后截断原文件,避免重启 Java 进程;若应用支持信号重开日志(如按 HUP),可改用 postrotate 发送信号。
- dateext/dateformat:旧日志以时间戳命名,便于检索与审计。
- 调试与生效
- 测试:sudo logrotate -d /etc/logrotate.d/myapp(仅校验)
- 强制执行一次:sudo logrotate -f /etc/logrotate.d/myapp
- 定时:系统通常通过 /etc/cron.daily/logrotate 每日运行,无需额外配置。
三 方案二 Shell 脚本 + cron 定时备份(灵活可控)
- 适用:需要自定义备份目录结构、同步到远程、或做额外处理(如脱敏、上传)。
- 示例脚本(备份 nohup 输出,并清空原日志)
-
创建脚本
cat > /opt/scripts/backup_java_logs.sh <<‘EOF’
#!/usr/bin/env bash
set -Eeuo pipefail
LOG_DIR=“/opt/myapp/logs”
BACKUP_DIR=“/opt/backups/java”
DATE=$(date +“%Y%m%d_%H%M%S”)
KEEP_DAYS=30
mkdir -p “$BACKUP_DIR”
备份匹配到的所有 .log 文件
for f in “$LOG_DIR”/*.log; do
[[ -f “$f” ]] || continue
bn=$(basename “$f”)
cp -a “$f” “$BACKUP_DIR/${bn%.log}_$DATE.log”
done
清空原日志(应用继续写入同一文件描述符)
: > “$LOG_DIR”/*.log
清理超过保留天数的备份
find “$BACKUP_DIR” -mtime +“$KEEP_DAYS” -type f -name “*.log” -delete
echo “$(date): Backup completed, kept last $KEEP_DAYS days.”
EOF
-
赋权与定时
chmod +x /opt/scripts/backup_java_logs.sh
每天 02:00 执行
(crontab -l 2>/dev/null; echo “0 2 * * * /opt/scripts/backup_java_logs.sh >> /var/log/backup_java.log 2>&1”) | crontab -
- 说明
- 若希望“归档后继续写入新文件”,可改为 mv 并重开应用;或改用 copytruncate 思路避免重启。
四 方案三 应用内日志框架归档(Log4j2 Logback)
- 适用:希望在应用侧精确控制滚动策略、归档命名、按大小/时间触发等。
- Logback 示例(按天滚动,保留 30 天)
- 配置:/opt/myapp/config/logback.xml
/opt/myapp/logs/app.log
/opt/myapp/logs/app.%d{yyyy-MM-dd}.gz
30
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
- Log4j2 示例(基于时间滚动)
- 使用 TimeBasedTriggeringPolicy 与 DefaultRolloverStrategy(max=20) 等策略实现按天/按大小滚动与保留。
五 方案四 集中式与云归档(检索与长期留存)
- 集中式检索
- 使用 rsyslog 收集系统与应用日志,或用 ELK(Elasticsearch/Logstash/Kibana) 做集中存储、分析与可视化;适合多实例与统一审计。
- 云对象存储长期归档
- 将 logrotate 轮转后的日志通过 S3cmd 同步至 S3/Spaces 等对象存储,实现低成本长期留存与合规归档。