一、使用Logrotate工具(系统级自动化归档)
Logrotate是CentOS系统自带的日志管理工具,可自动完成Java日志的轮转、压缩、删除等操作,无需修改Java代码,适合系统级统一管理。
sudo yum install logrotate命令安装(CentOS默认仓库包含该工具)。/etc/logrotate.d/目录下新建Java应用专属配置文件(如/etc/logrotate.d/my_java_app),内容示例如下:/path/to/your/java/app/logs/*.log {
daily # 每天归档一次(可选:weekly/monthly)
rotate 7 # 保留最近7个归档文件(可根据磁盘空间调整)
compress # 使用gzip压缩归档文件(减少存储占用)
delaycompress # 延迟压缩(如第8个文件才压缩第1个归档,避免压缩当天日志)
missingok # 日志文件不存在时不报错(避免应用未启动时报错)
notifempty # 日志文件为空时不归档(节省资源)
create 640 root root # 归档后创建新日志文件,权限640,属主root、属组root
sharedscripts # 所有日志处理完成后执行postrotate脚本(避免多次重启应用)
postrotate
/bin/kill -USR1 $(cat /var/run/my_java_app.pid) 2>/dev/null || true # 通知Java应用重新打开日志文件(需替换为实际PID文件路径)
endscript
}
sudo logrotate -d /etc/logrotate.d/my_java_app(模拟运行,显示将要执行的操作,不实际修改文件)。sudo logrotate -f /etc/logrotate.d/my_java_app(跳过检查,立即执行归档)。/etc/cron.daily/logrotate定时任务每天自动运行,无需额外配置。二、通过Java日志框架内置功能(应用级灵活归档)
若Java应用使用Log4j、Logback等日志框架,可直接在配置文件中设置归档策略,实现更细粒度的控制(如按文件大小、时间滚动,自定义归档格式)。
RollingFileAppender结合MaxFileSize(单文件最大大小)、MaxBackupIndex(保留备份数量)实现按大小滚动:<appender name="ROLLING_FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/path/to/your/java/app/logs/app.log"/>
<param name="MaxFileSize" value="10MB"/> <!-- 单个日志文件最大10MB -->
<param name="MaxBackupIndex" value="10"/> <!-- 保留10个备份文件 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</layout>
</appender>
TimeBasedRollingPolicy(按时间滚动)结合SizeAndTimeBasedRollingPolicy(按大小+时间滚动),支持更灵活的归档策略:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/path/to/your/java/app/logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/path/to/your/java/app/logs/app-%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 归档文件名格式:app-2025-10-17.log -->
<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>
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/path/to/your/java/app/logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/path/to/your/java/app/logs/app-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- i表示序号,如app-2025-10-17.0.log -->
<maxFileSize>10MB</maxFileSize> <!-- 单个文件最大10MB -->
<maxHistory>30</maxHistory> <!-- 保留30天的归档文件 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 所有归档文件总大小不超过1GB -->
</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>
logback-core、logback-classic;Log4j需log4j-core、log4j-api)。三、自定义Shell脚本+定时任务(低成本定制化归档)
若不想依赖系统工具或日志框架,可通过Shell脚本实现日志压缩归档,结合Cron定时任务定期执行。
/usr/local/bin/archive_java_logs.sh,内容如下:#!/bin/bash
LOG_DIR="/path/to/your/java/app/logs" # Java日志目录
ARCHIVE_DIR="/path/to/your/java/app/archive" # 归档存储目录
mkdir -p "$ARCHIVE_DIR" # 创建归档目录(不存在则新建)
# 压缩并移动所有.log文件到归档目录
for log_file in "$LOG_DIR"/*.log; do
if [ -f "$log_file" ]; then
gzip "$log_file" # 压缩日志文件
mv "${log_file}.gz" "$ARCHIVE_DIR" # 移动到归档目录
fi
done
# 可选:删除7天前的归档文件(节省空间)
find "$ARCHIVE_DIR" -name "*.gz" -mtime +7 -exec rm -f {} \;
chmod +x /usr/local/bin/archive_java_logs.sh。crontab -e添加以下内容,每天凌晨2点执行脚本:0 2 * * * /usr/local/bin/archive_java_logs.sh >> /var/log/archive_java_logs.log 2>&1
该配置会将脚本输出(包括错误信息)追加到/var/log/archive_java_logs.log中,便于排查问题。注意事项
/path/to/archive)有正确的写入权限(通常为root或应用属主)。rotate 7、maxHistory 30),避免归档文件占用过多存储。postrotate脚本,需确保正确通知应用重启日志文件(如通过kill -USR1发送信号),否则可能导致日志丢失。