Ubuntu中Java日志归档的常见方法
logrotate是Ubuntu系统原生的日志管理工具,可自动完成Java日志的轮转、压缩、删除及权限设置,无需修改Java代码,适合大多数场景。
sudo apt-get update && sudo apt-get install logrotate
/etc/logrotate.d/目录下创建专门的Java日志配置文件(如java_app),内容示例如下(根据实际路径调整):/path/to/your/java/logs/*.log {
daily # 每天轮转一次(可选:weekly/monthly)
rotate 7 # 保留最近7个归档文件
compress # 使用gzip压缩旧日志(节省空间)
delaycompress # 延迟压缩(如第7个文件不压缩,避免影响性能)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 root adm # 新日志文件权限(属主:root,属组:adm)
sharedscripts # 所有日志轮转完成后执行postrotate脚本
postrotate
# 可选:重启Java应用或发送信号触发日志重新写入(如Spring Boot应用)
# systemctl restart your-java-app.service
endscript
}
sudo logrotate -d /etc/logrotate.d/java_app
强制立即执行轮转(如需立即生效):sudo logrotate -f /etc/logrotate.d/java_app
logrotate会自动添加到系统cron任务中,无需额外设置定时任务。若Java应用使用Logback、Log4j2等日志框架,可直接在配置文件中设置自动归档策略,实现更灵活的日志管理(如按时间/大小分割、自定义归档路径)。
logback.xml):<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file> <!-- 当前日志文件路径 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 归档文件名格式(日期+序号) -->
<maxHistory>30</maxHistory> <!-- 保留30天的归档文件 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize> <!-- 单个文件最大10MB -->
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
log4j2.xml):<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/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="10 MB"/> <!-- 或达到10MB时轮转 -->
</Policies>
<DefaultRolloverStrategy max="30"/> <!-- 最多保留30个归档文件 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
这种方式的优点是归档策略与应用绑定,无需依赖系统工具,适合需要定制化归档规则的场景。若Java应用以systemd服务运行(如通过systemctl start my-java-app启动),可通过journald管理日志,实现集中化存储和自动清理。
/etc/systemd/system/my-java-app.service),在[Service]部分添加:StandardOutput=journal
StandardError=journal
SyslogIdentifier=my-java-app # 日志标识符(用于过滤)
重启服务使配置生效:sudo systemctl daemon-reload
sudo systemctl restart my-java-app
/etc/systemd/journald.conf,调整以下参数(取消注释并修改):[Journal]
SystemMaxUse=500M # 日志总大小上限(超过则删除旧日志)
SystemKeepFree=100M # 保留的最小空闲空间
SystemMaxFileSize=50M # 单个日志文件最大大小
SystemMaxFiles=10 # 保留的最新日志文件数量
重启journald服务应用配置:sudo systemctl restart systemd-journald
查看应用日志:journalctl -u my-java-app -f # 实时查看
journalctl -u my-java-app --since "2025-11-01" # 按时间过滤
这种方式适合容器化或systemd管理的服务,日志由系统统一管理,无需手动清理。若需要将Java日志备份到远程服务器或特定目录(如NAS),可编写Shell脚本结合cron定时任务实现。
/usr/local/bin/backup_java_logs.sh):#!/bin/bash
BACKUP_DIR="/mnt/nas/java_logs_backup" # 备份目录(需提前创建)
LOG_DIR="/path/to/your/java/logs" # Java日志目录
DATE=$(date +%Y%m%d_%H%M%S) # 当前时间(用于文件名)
# 创建备份目录(若不存在)
mkdir -p "$BACKUP_DIR"
# 压缩并备份日志文件
tar -czf "$BACKUP_DIR/java_logs_$DATE.tar.gz" -C "$LOG_DIR" .
# 删除30天前的备份文件
find "$BACKUP_DIR" -type f -name "java_logs_*.tar.gz" -mtime +30 -exec rm -f {} \;
赋予脚本执行权限:chmod +x /usr/local/bin/backup_java_logs.sh
crontab -e
添加以下行(每天凌晨2点执行备份):0 2 * * * /usr/local/bin/backup_java_logs.sh
这种方式适合需要异地备份或多目录归档的场景,灵活性高,但需手动维护脚本。