logrotate是Linux系统自带的日志管理工具,可自动完成日志的轮转、压缩、删除等操作,适合批量管理Java应用的日志文件。
sudo yum install logrotate # CentOS/RHEL系统
sudo apt install logrotate # Ubuntu/Debian系统
/etc/logrotate.d/java文件,添加以下内容(根据实际路径调整):/path/to/your/java/logs/*.log {
daily # 按天轮转(可选:weekly/monthly)
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0644 root root # 轮转后创建新日志文件并设置权限
}
logrotate -d /etc/logrotate.d/java
重新加载配置使生效:sudo systemctl reload logrotate
通过Shell脚本实现定制化的日志备份(如按日期命名)和过期清理,适合需要额外处理的场景(如上传备份到远程服务器)。
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日志目录
# 备份日志文件(带日期后缀)
cp "$LOG_DIR"/*.log "$BACKUP_DIR/java_$DATE.log"
# 清空原始日志文件(避免占用空间)
> "$LOG_DIR"/*.log
# 删除30天前的备份文件
find "$BACKUP_DIR" -mtime +30 -type f -name "java_*.log" -exec rm -f {} \;
crontab -e编辑当前用户的定时任务,添加以下内容(每天凌晨0点执行):0 0 * * * /path/to/backup_java_logs.sh
在Java应用中配置日志框架(如Log4j、Logback)的轮转策略,从应用层面控制日志文件的大小和数量,避免日志无限增长。
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}.log.gz</fileNamePattern> <!-- 轮转文件名(带日期+压缩) -->
<maxHistory>30</maxHistory> <!-- 保留30天的日志 -->
</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):<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy /> <!-- 按天轮转 -->
<SizeBasedTriggeringPolicy size="100 MB"/> <!-- 单个文件超过100MB时轮转 -->
</Policies>
<DefaultRolloverStrategy max="20"/> <!-- 最多保留20个备份 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
若Java应用通过systemd启动(如使用systemctl start java-app),其日志由journalctl管理,可通过以下命令清理:
sudo journalctl --vacuum-time=1w # 只保留最近1周的日志
sudo journalctl --vacuum-size=500M # 只保留500MB以内的日志
java-app服务):sudo journalctl --unit=java-app --vacuum-time=3d # 只保留最近3天的该服务日志
对于临时或无用的日志,可直接通过命令手动删除(谨慎操作,避免误删正在使用的日志):
find /path/to/java/logs -type f -name "*.log" -mtime +30 -exec rm -f {} \;
> /path/to/java/logs/app.log # 清空文件内容
以上技巧可根据实际需求组合使用(如logrotate批量管理+Logback应用层轮转),确保Java日志既不会占用过多磁盘空间,又能保留必要的历史记录。