使用logrotate进行日志轮转与备份
logrotate是Ubuntu系统自带的日志管理工具,可自动完成Java日志的轮转、压缩、删除及权限设置,是最常用的备份方案。
sudo apt-get install logrotate命令安装。/etc/logrotate.d/myjavaapp),添加以下内容(以/var/log/myapp/*.log为例):/var/log/myapp/*.log {
daily # 每天轮转一次
rotate 7 # 保留7天的备份文件
compress # 使用gzip压缩旧日志(如myapp.log.1.gz)
missingok # 若日志文件不存在,不报错
notifempty # 若日志为空,不进行轮转
create 0640 root root # 新日志文件的权限与所有者
}
sudo logrotate -d /etc/logrotate.d/myjavaapp测试配置是否正确(模拟执行,不实际修改文件);修改完成后,系统会自动通过cron任务每日执行,无需额外操作。编写Shell脚本实现自动备份与清理
通过Shell脚本可灵活控制备份逻辑(如添加时间戳、清理旧备份),适合需要自定义的场景。
backup_java_logs.sh,内容如下(以/opt/myapp/logs/app.log为例):#!/bin/bash
BACKUP_DIR="/opt/myapp/backup" # 备份目录
LOG_DIR="/opt/myapp/logs" # Java日志目录
DATE=$(date +"%Y%m%d_%H%M%S") # 当前时间戳(用于文件名)
# 备份日志文件(带时间戳)
cp "$LOG_DIR/app.log" "$BACKUP_DIR/app_$DATE.log"
echo "[$(date)] Backup completed: $BACKUP_DIR/app_$DATE.log" >> "$BACKUP_DIR/backup.log"
# 清空原始日志文件(避免占用过多空间)
> "$LOG_DIR/app.log"
# 删除30天前的备份文件(保留近期备份)
find "$BACKUP_DIR" -type f -name "app_*.log" -mtime +30 -exec rm -f {} \;
chmod +x backup_java_logs.sh赋予脚本执行权限;使用crontab -e添加定时任务(如每小时执行一次):0 * * * * /opt/myapp/backup_java_logs.sh
利用Java日志框架内置归档功能
若Java应用使用Log4j2、Logback等框架,可通过配置框架自身的滚动策略实现日志自动归档,无需依赖外部工具。
log4j2.xml):<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile"
fileName="/var/log/myapp/app.log" <!-- 当前日志文件路径 -->
filePattern="/var/log/myapp/app-%d{yyyy-MM-dd}-%i.log.gz"> <!-- 归档文件路径(含日期和序号) -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 按天滚动 -->
<SizeBasedTriggeringPolicy size="250 MB"/> <!-- 单个文件超过250MB时滚动 -->
</Policies>
<DefaultRolloverStrategy max="7"/> <!-- 最多保留7个归档文件 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
该配置实现了按天+按大小双重滚动,归档文件自动压缩为.gz格式,保留7天内的备份。通过systemd journalctl管理日志
若Java应用以systemd服务运行(如myapp.service),可使用journalctl工具收集、存储和备份系统日志。
/etc/systemd/journald.conf,调整以下参数(限制日志总大小为500MB,保留5个日志文件):[Journal]
SystemMaxUse=500M
SystemMaxFiles=5
sudo systemctl restart systemd-journald使配置生效;通过journalctl -u myapp.service查看Java应用的日志,或使用journalctl --vacuum-size=200M清理旧日志(保留200MB以内)。使用第三方日志管理工具(如ELK Stack)
对于需要集中管理、实时分析或大规模日志存储的场景,可使用ELK(Elasticsearch+Logstash+Kibana)或Graylog等工具。
logstash.conf,定义输入(从Java日志文件读取)、过滤(解析日志格式)、输出(发送到Elasticsearch);