温馨提示×

Ubuntu Java日志备份方法

小樊
44
2025-12-25 16:50:39
栏目: 编程语言

Ubuntu Java日志备份方法

一 常用方案总览

  • logrotate 本地轮转与压缩:系统自带、稳定可靠,适合大多数 Java 应用(含 nohup 输出和框架日志)。支持按天轮转、压缩、保留份数、按日期命名等。
  • Shell 脚本 + cron 定时备份:灵活可控,适合需要自定义命名、异地拷贝或额外清理逻辑的场景。
  • 应用内日志框架归档:在 Log4j2/Logback 中配置按时间/大小滚动,天然支持归档与保留策略。
  • 集中式与云归档:用 rsyslog/ELK 做集中与检索,或将已轮转日志通过 S3cmd 上传至对象存储做长期留存。

二 方案一 Logrotate 本地轮转与压缩(推荐)

  • 适用:日志文件持续增长、希望自动化轮转与清理、尽量不改动应用。
  • 步骤:
    1. 创建配置(示例为单文件,也可用通配符处理多日志) 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
    2. 关键参数说明
      • daily/rotate 30/compress/delaycompress:按天轮转、保留 30 天、压缩旧日志(delaycompress 常用于避免压缩正在写入的文件)。
      • missingok/notifempty:文件缺失不报错、空文件不轮转。
      • copytruncate:复制后截断原文件,避免重启 Java 进程;若应用支持信号重开日志(如按 HUP),可改用 postrotate 发送信号。
      • dateext/dateformat:旧日志以时间戳命名,便于检索与审计。
    3. 调试与生效
      • 测试: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 示例(基于时间滚动)
    • 使用 TimeBasedTriggeringPolicyDefaultRolloverStrategy(max=20) 等策略实现按天/按大小滚动与保留。

五 方案四 集中式与云归档(检索与长期留存)

  • 集中式检索
    • 使用 rsyslog 收集系统与应用日志,或用 ELK(Elasticsearch/Logstash/Kibana) 做集中存储、分析与可视化;适合多实例与统一审计。
  • 云对象存储长期归档
    • logrotate 轮转后的日志通过 S3cmd 同步至 S3/Spaces 等对象存储,实现低成本长期留存与合规归档。

0