一、使用Logrotate工具(系统级自动化归档)
Logrotate是CentOS系统自带的日志管理工具,可自动完成Java日志的轮转、压缩、删除等操作,无需修改Java代码,适合大多数常规场景。
sudo yum install logrotate -y
/etc/logrotate.d/目录下新建Java应用专属配置(如myapp),内容示例如下:/path/to/your/java/app/logs/*.log {
daily # 每天归档一次(可选:weekly/monthly)
rotate 7 # 保留最近7个归档文件
compress # 使用gzip压缩旧日志(节省空间)
delaycompress # 延迟压缩(如第7个归档文件暂不压缩,下次归档时再处理)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不归档
create 640 root root # 归档后创建新日志文件,权限640,属主root
sharedscripts # 所有日志处理完成后统一执行postrotate脚本
postrotate
/bin/kill -USR1 `cat /var/run/myapp.pid` 2>/dev/null || true # 通知Java应用重新打开日志文件(需替换为实际PID文件路径)
endscript
}
sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp
/etc/cron.daily/logrotate每日自动执行,无需额外配置定时任务。二、通过Java日志框架内置功能(应用级精准控制)
若Java应用使用Log4j、Logback等框架,可直接在配置文件中设置归档策略,实现更精准的控制(如按文件大小、时间双重触发)。
RollingFileAppender实现按大小和数量归档:log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=/var/log/myapp/myapp.log
log4j.appender.fileAppender.MaxFileSize=10MB # 单个日志文件最大10MB
log4j.appender.fileAppender.MaxBackupIndex=10 # 保留10个归档文件
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
TimeBasedRollingPolicy(按时间)或SizeAndTimeBasedRollingPolicy(按时间+大小),支持GZIP压缩和总大小限制:<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/myapp-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- 按天归档,每天最多1个文件,每个文件最大10MB,保留30天 -->
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<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>
注:框架内置的归档策略更贴合应用本身,适合需要根据业务日志特性调整的场景(如高频交易日志按小时分割)。
三、自定义Shell脚本+定时任务(灵活扩展)
若需要更灵活的归档逻辑(如归档到远程服务器、添加自定义前缀),可编写Shell脚本并通过Cron定时执行。
#!/bin/bash
LOG_DIR="/path/to/your/java/app/logs"
ARCHIVE_DIR="/path/to/archive/java_logs"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建归档目录(若不存在)
mkdir -p "$ARCHIVE_DIR"
# 压缩并移动日志文件(保留原日志文件,避免应用中断)
for log_file in "$LOG_DIR"/*.log; do
if [ -f "$log_file" ]; then
gzip -c "$log_file" > "$ARCHIVE_DIR/${log_file##*/}.$DATE.gz"
# 可选:清空原日志文件(避免重复归档)
> "$log_file"
fi
done
# 删除7天前的归档文件(释放空间)
find "$ARCHIVE_DIR" -name "*.gz" -mtime +7 -exec rm -f {} \;
chmod +x /path/to/archive_java_logs.sh
# 编辑Cron任务(每天凌晨2点执行)
(crontab -l 2>/dev/null; echo "0 2 * * * /path/to/archive_java_logs.sh") | crontab -
注:此方法适合需要自定义归档流程(如同步到S3、添加水印)的场景,但需手动维护脚本和Cron任务。
四、使用Systemd Journal(适用于Systemd管理的Java应用)
若Java应用通过Systemd启动(如使用systemctl start myapp),可利用journald统一管理日志,无需单独配置文件归档。
/etc/systemd/system/myapp.service):[Unit]
Description=My Java Application
After=network.target
[Service]
User=myuser
ExecStart=/usr/bin/java -jar /path/to/myapp.jar
StandardOutput=journal # 将标准输出重定向到journald
StandardError=journal # 将标准错误重定向到journald
SyslogIdentifier=myapp # 日志标识符(用于journalctl过滤)
[Install]
WantedBy=multi-user.target
/etc/systemd/journald.conf):[Journal]
SystemMaxUse=500M # 日志总大小上限(超过则自动清理旧日志)
SystemKeepFree=100M # 磁盘剩余空间下限
SystemMaxFileSize=50M # 单个日志文件大小上限
SystemMaxFiles=5 # 保留的最新日志文件数量
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
# 查看应用日志(支持按时间、关键字过滤)
sudo journalctl -u myapp.service -since "2025-10-01" -until "2025-10-07"
注:journald的优势是集中管理所有系统日志,适合容器化或微服务环境,但日志存储在二进制格式中,需通过
journalctl工具查看。
五、第三方日志收集工具(大规模场景推荐)
对于分布式系统或需要长期存储、分析日志的场景,建议使用ELK Stack(Elasticsearch+Logstash+Kibana)或Fluentd等工具,实现日志的集中收集、存储、搜索和可视化。
以上策略可根据实际需求组合使用(如Logrotate处理本地归档+ELK处理集中分析),确保Java日志的可维护性和可追溯性。