You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:47:23