logrotate是Linux系统自带的日志管理工具,可自动实现日志轮转、压缩、删除及权限管理,适用于大多数Java应用日志场景。
配置步骤:
sudo yum install logrotate(CentOS/RHEL)或sudo apt install logrotate(Ubuntu/Debian)。sudo nano /etc/logrotate.d/java,添加以下内容(根据实际路径调整):/path/to/your/java/logs/*.log { daily # 按天轮转(可选:weekly/monthly) rotate 7 # 保留7个历史日志文件(可根据存储空间调整) compress # 压缩旧日志(节省空间,生成.gz文件) missingok # 日志文件不存在时不报错 notifempty # 日志为空时不轮转 create 0644 root root # 新日志文件权限(属主/属组可调整) } sudo logrotate -d /etc/logrotate.d/java(模拟运行,不实际修改文件)。sudo logrotate -f /etc/logrotate.d/java(强制立即执行)。/etc/cron.daily/logrotate)。通过Shell脚本实现日志备份、清空或删除,结合crontab定时执行,适合需要自定义清理逻辑的场景(如按文件大小、特定命名规则清理)。
示例脚本(backup_clean_logs.sh):
#!/bin/bash # 设置日志目录与备份目录 LOG_DIR="/path/to/your/java/logs" BACKUP_DIR="/path/to/backup/java_logs" DATE=$(date +%Y%m%d) # 备份日志(带日期后缀) cp ${LOG_DIR}/*.log ${BACKUP_DIR}/${DATE}.log # 清空原始日志文件(避免占用磁盘空间) > ${LOG_DIR}/*.log # 删除30天前的备份文件(保留近期日志) find ${BACKUP_DIR} -type f -name "*.log" -mtime +30 -exec rm -f {} \; 设置定时任务:
crontab -e。0 0 * * * /bin/bash /path/to/backup_clean_logs.sh 通过Java日志框架(如Log4j、Logback)的配置,实现日志文件的自动滚动(按时间/大小分割)、归档及删除,避免日志文件无限增长。
Logback配置示例(logback.xml):
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/myapp.log</file> <!-- 当前日志文件路径 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 滚动文件命名规则(按天分割) --> <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> Log4j 2配置示例(log4j2.xml):
<Configuration> <Appenders> <RollingFile name="File" 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="File"/> </Root> </Loggers> </Configuration> 优势:从应用源头控制日志生命周期,无需依赖外部工具,适合需要精细化管理的场景。
若Java应用通过Systemd(如java -jar app.jar以systemd服务运行),可使用journalctl工具管理其日志。
常用命令:
sudo journalctl --vacuum-time=1w(保留最近1周日志)或sudo journalctl --vacuum-size=500M(保留最近500MB日志)。sudo journalctl --unit=my-java-app --vacuum-time=3d(保留my-java-app服务最近3天日志)。sudo rm -rf /var/log/journal/*(会清空所有Systemd日志)。通过find命令快速查找并删除符合条件的日志文件,适合临时清理或脚本中调用。
常用示例:
find /path/to/logs -type f -name "*.log" -mtime +7 -exec rm -f {} \;。find /path/to/logs -type f -name "*.log" -size +100M -exec truncate -s 0 {} \;(不清除文件,仅清空内容)。-exec部分),避免误删。以上策略可根据实际需求组合使用(如用logrotate做日常轮转+Shell脚本做备份,或用应用内配置做源头控制+find命令做临时清理),确保Java日志不会过度占用磁盘空间。