CentOS上Java日志备份策略
logrotate是CentOS系统自带的日志管理工具,可自动完成Java日志的轮转、压缩、删除及权限设置,无需额外安装依赖,适合大多数场景。
sudo yum install logrotate命令安装。/etc/logrotate.d/java文件(文件名可根据应用命名,如myapp),添加以下配置(以/var/log/myapp/*.log为例):/var/log/myapp/*.log {
daily # 每天轮转一次(可选:weekly/monthly)
rotate 7 # 保留最近7天的日志文件
compress # 使用gzip压缩旧日志(减少存储占用)
delaycompress # 延迟压缩(如第8天压缩第7天的日志,避免压缩当天日志)
missingok # 若日志文件不存在,不报错
notifempty # 若日志文件为空,不进行轮转
create 640 root adm # 创建新日志文件,权限640,属主root,属组adm(适配系统日志规范)
}
sudo logrotate -d /etc/logrotate.d/java测试配置语法(模拟运行,不实际修改文件);无误后通过sudo systemctl reload logrotate重新加载配置,使设置生效。若需要更复杂的备份逻辑(如打包为tar.gz、同步到远程服务器、发送告警),可通过Shell脚本实现,配合cron定时任务自动执行。
/usr/local/bin/backup_java_logs.sh,内容如下(以/var/log/myapp为例):#!/bin/bash
LOG_DIR="/var/log/myapp" # Java日志目录
BACKUP_DIR="/backup/java_logs" # 本地备份目录
REMOTE_USER="backup_user" # 远程服务器用户名(可选)
REMOTE_HOST="remote.server.com" # 远程服务器地址(可选)
REMOTE_DIR="/remote/backup/java_logs" # 远程备份目录(可选)
DATE=$(date +%Y%m%d_%H%M%S) # 备份时间戳(精确到秒)
# 创建本地备份目录
mkdir -p "$BACKUP_DIR"
# 备份日志(打包为tar.gz,保留目录结构)
tar -czf "$BACKUP_DIR/myapp_backup_$DATE.tar.gz" -C "$LOG_DIR" .
# 删除本地超过30天的备份文件
find "$BACKUP_DIR" -type f -name "myapp_backup_*.tar.gz" -mtime +30 -exec rm -f {} \;
# 可选:同步到远程服务器(需配置SSH免密登录)
# scp "$BACKUP_DIR/myapp_backup_$DATE.tar.gz" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
# ssh "$REMOTE_USER@$REMOTE_HOST" "find $REMOTE_DIR -type f -name 'myapp_backup_*.tar.gz' -mtime +30 -exec rm -f {} \;"
sudo chmod +x /usr/local/bin/backup_java_logs.sh。sudo crontab -e添加以下行,实现每天凌晨2点自动执行备份:0 2 * * * /usr/local/bin/backup_java_logs.sh >> /var/log/backup_java.log 2>&1
(>> /var/log/backup_java.log 2>&1将脚本输出追加到日志文件,便于排查问题)。通过Java日志框架(如Log4j、Logback)的配置,实现日志文件的自动轮转和归档,适合需要精细化控制日志格式、大小及保留策略的场景。
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/myapp/app.log # 日志文件路径
log4j.appender.file.MaxFileSize=10MB # 单个日志文件最大大小(超过则轮转)
log4j.appender.file.MaxBackupIndex=10 # 保留的轮转日志数量
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/app-%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 按天分割 -->
<maxHistory>30</maxHistory> <!-- 保留30天的日志 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
通过上述配置,Java应用会自动按大小(Log4j)或时间(Logback)分割日志,并保留指定数量的归档文件,减少手动干预。若需防范本地磁盘故障或数据丢失,可将Java日志备份到远程服务器(如NAS、云存储),常用工具为rsync(支持增量同步,节省带宽)。
/usr/local/bin/backup_java_logs_remote.sh,内容如下:#!/bin/bash
LOCAL_LOG_DIR="/var/log/myapp"
REMOTE_USER="backup_user"
REMOTE_HOST="remote.server.com"
REMOTE_DIR="/remote/backup/java_logs"
DATE=$(date +%Y%m%d_%H%M%S)
# 打包本地日志并同步到远程服务器(通过ssh)
tar -czf - "$LOCAL_LOG_DIR" | ssh "$REMOTE_USER@$REMOTE_HOST" "tar -xzf - -C $REMOTE_DIR/myapp_backup_$DATE"
# 可选:删除远程超过30天的备份
ssh "$REMOTE_USER@$REMOTE_HOST" "find $REMOTE_DIR -type f -name 'myapp_backup_*.tar.gz' -mtime +30 -exec rm -f {} \;"
0 3 * * * /usr/local/bin/backup_java_logs_remote.sh >> /var/log/backup_java_remote.log 2>&1
(需提前配置本地与远程服务器的SSH免密登录,确保脚本可自动连接)。为避免备份失败或磁盘空间不足导致日志丢失,需设置监控与告警机制,及时通知管理员处理。
df -h命令查看磁盘使用情况,通过cron定期检查(如每天凌晨1点),若磁盘使用率超过80%,发送邮件告警:#!/bin/bash
THRESHOLD=80 # 磁盘使用率阈值(%)
USAGE=$(df / | grep / | awk '{print $5}' | sed 's/%//g')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "Disk usage on / is over $THRESHOLD%: $USAGE%" | mail -s "Disk Space Alert" admin@example.com
fi
/var/log/backup_java.log中是否有最近的备份记录,若超过24小时无新记录,发送告警:#!/bin/bash
LOG_FILE="/var/log/backup_java.log"
LAST_BACKUP_TIME=$(grep "备份完成" "$LOG_FILE" | tail -1 | awk '{print $1, $2}')
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
TIME_DIFF=$(( $(date -d "$CURRENT_TIME" +%s) - $(date -d "$LAST_BACKUP_TIME" +%s) ))
if [ "$TIME_DIFF" -gt 86400 ]; then # 86400秒=1天
echo "Java log backup failed or not executed in the last 24 hours" | mail -s "Backup Alert" admin@example.com
fi
将上述脚本添加到cron中,每天凌晨4点执行,确保及时发现问题。