1. 使用logrotate工具实现自动化日志轮转与清理
logrotate是CentOS系统自带的日志管理工具,可自动完成Java日志的轮转、压缩、删除等操作,避免日志文件过大占用磁盘空间。
sudo yum install logrotate(CentOS 7)或sudo dnf install logrotate(CentOS 8)安装。/etc/logrotate.d/目录下创建专门配置文件(如java_app),添加以下内容(需替换为实际日志路径):/path/to/your/java/logs/*.log {
daily # 每天轮转一次
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(如.gz格式)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root root # 新日志文件权限及属主
postrotate
# 可选:通知Java应用重新打开日志文件(需根据应用调整)
# kill -USR1 $(cat /path/to/java_app.pid)
endscript
}
sudo logrotate -d /etc/logrotate.d/java_app测试配置是否正确(模拟运行,不实际修改文件);若测试无误,用sudo systemctl reload logrotate重新加载配置,使规则生效。2. 编写Shell脚本定期备份与清理
通过Shell脚本可灵活实现Java日志的备份、清空及旧备份删除,适合需要自定义备份路径或命名规则的场景。
backup_java_logs.sh,内容如下(替换为实际路径):#!/bin/bash
BACKUP_DIR="/path/to/backup/directory" # 备份目录
DATE=$(date +%Y%m%d) # 当前日期(用于备份文件名)
LOG_DIR="/path/to/your/java/logs" # Java日志目录
# 备份日志:将所有.log文件复制到备份目录并重命名
cp $LOG_DIR/*.log "$BACKUP_DIR/java_backup_$DATE.log"
# 清空原始日志文件(避免日志堆积)
> $LOG_DIR/*.log
# 删除30天前的备份文件(保留最近30天)
find $BACKUP_DIR -mtime +30 -type f -name "java_backup_*.log" -exec rm -f {} \;
crontab -e添加以下行,让脚本每天凌晨0点自动执行:0 0 * * * /bin/bash /path/to/backup_java_logs.sh
3. 利用Java日志框架内置轮转策略(推荐)
若Java应用使用Log4j、Logback等日志框架,可直接在配置文件中设置日志轮转规则,无需依赖系统工具,更贴合应用自身需求。
logback.xml):<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/path/to/your/java/logs/app.log</file> <!-- 当前日志文件路径 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/path/to/your/java/logs/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern> <!-- 轮转文件命名(带日期+压缩) -->
<maxHistory>30</maxHistory> <!-- 保留最近30天的日志 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> <!-- 日志格式 -->
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
log4j.properties):log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/java-app.log
log4j.appender.file.MaxFileSize=10MB <!-- 单个日志文件最大10MB -->
log4j.appender.file.MaxBackupIndex=10 <!-- 保留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
4. 使用journalctl管理systemd服务的Java日志
若Java应用通过systemd启动(如java -jar app.jar被封装为systemd服务),可使用journalctl工具管理其日志。
# 只保留最近1周的日志
sudo journalctl --vacuum-time=1w
# 只保留500MB以内的日志
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=0 # 清空所有日志
5. 手动清理临时或过期日志(应急使用)
若需快速释放磁盘空间,可手动删除指定目录下的旧日志文件,但需注意避免影响正在运行的应用。
find /path/to/java/logs -type f -name "*.log" -mtime +30 -exec rm -f {} \;
> /path/to/java/logs/app.log # 清空文件内容(不删除文件本身)