如何限制Quarkus日志目录中的日志文件数量至20个?
限制Quarkus日志目录总文件数的可行方案
针对你遇到的Quarkus日志文件日积月累占存储的问题,以下是几个实用的解决思路:
1. 定时清理脚本(最直接高效)
写个简单的脚本定时清理日志目录,只保留最新的20个日志文件,不受后缀格式限制。
Linux/macOS Shell脚本示例
#!/bin/bash # 替换为你的Quarkus日志目录实际路径 LOG_DIR="/opt/quarkus-app/logs" MAX_ALLOWED=20 # 筛选日志文件(匹配application.log及各类备份文件),按修改时间排序取最早的待删文件 TO_DELETE=$(ls -1tr "$LOG_DIR"/application*.log* | head -n $(( $(ls -1 "$LOG_DIR"/application*.log* | wc -l) - MAX_ALLOWED )) ) # 如果有待删文件,执行删除操作 if [ -n "$TO_DELETE" ]; then echo "Cleaning old logs: $TO_DELETE" rm -f $TO_DELETE fi
然后通过crontab设置定时任务,比如每小时执行一次:
0 * * * * /path/to/your/clean-log.sh >> /var/log/clean-log-cron.log 2>&1
Windows批处理示例
@echo off set LOG_DIR=C:\quarkus-app\logs set MAX_ALLOWED=20 :: 按修改时间排序日志文件,导出到临时文件 dir /b /o:d "%LOG_DIR%\application*.log*" > "%TEMP%\log_list.txt" :: 计算需要删除的文件数 for /f %%a in ('type "%TEMP%\log_list.txt" ^| find /c /v ""') do set FILE_COUNT=%%a set /a DELETE_COUNT=FILE_COUNT - MAX_ALLOWED :: 如果需要删除,循环删除最早的N个文件 if %DELETE_COUNT% gtr 0 ( for /f "skip=0 tokens=1-%DELETE_COUNT%" %%b in ('type "%TEMP%\log_list.txt"') do ( del "%LOG_DIR%\%%b" ) ) del "%TEMP%\log_list.txt"
添加到Windows任务计划,设置定时执行即可。
2. 调整日志滚动策略+脚本兜底
修改Quarkus日志配置,扩大单后缀的备份数,同时优化滚动规则减少文件生成:
# 日志文件路径 quarkus.log.file.path=./logs/application.log # 按100MB大小触发滚动 quarkus.log.file.rotation.max-file-size=100M # 同后缀备份数设为20(比如application.log.1到.log.20) quarkus.log.file.rotation.max-backup-index=20 # 如果需要按日期滚动,添加日期后缀 quarkus.log.file.rotation.file-suffix=-yyyy-MM-dd
这种配置下,日常场景大概率能控制文件数在20以内,但如果某天日志量暴增生成多个文件,还是会超限,搭配上面的清理脚本兜底更可靠。
3. 自定义Quarkus日志扩展(无外部依赖)
如果不想用外部脚本,可以写个轻量扩展,监听日志滚动事件,自动清理旧文件:
- 实现
FileHandler的扩展,重写rollover()方法 - 在滚动完成后,遍历日志目录统计文件总数
- 超过20个时,按修改时间删除最早的文件
核心代码示例(简化版):
public class CustomFileHandler extends FileHandler { private static final int MAX_FILES = 20; private static final String LOG_DIR = "./logs"; @Override public void rollover() throws SecurityException { super.rollover(); cleanOldLogs(); } private void cleanOldLogs() { File logDir = new File(LOG_DIR); File[] logs = logDir.listFiles(f -> f.getName().matches("application.*\\.log(\\.[0-9]+)?")); if (logs == null || logs.length <= MAX_FILES) return; // 按修改时间排序,删除最早的多余文件 Arrays.sort(logs, Comparator.comparingLong(File::lastModified)); int deleteCount = logs.length - MAX_FILES; for (int i = 0; i < deleteCount; i++) { logs[i].delete(); } } }
然后在Quarkus配置中指定使用这个自定义Handler:
quarkus.log.handler.file.class=com.yourpackage.CustomFileHandler
内容的提问来源于stack exchange,提问作者jguerra
相关产品推荐
相关产品推荐

