嵌入式Jetty 9.2.22中setRetainDays配置不生效问题求助
解决Jetty 9.2.22中NCSARequestLog retainDays参数不生效的问题
我之前维护Jetty 9.2.x版本服务时,也碰到过一模一样的日志无法自动删除的问题,结合你的描述和代码片段,大概率是几个关键配置没到位,咱们一步步来排查解决:
核心问题:日志文件名格式与filenameDateFormat不匹配
这是最容易踩的坑!NCSARequestLog清理旧日志时,会依据filenameDateFormat生成文件匹配规则,找不到对应格式的文件自然不会删除。你代码里的文件名是http-yyyy_mm_dd.log,这里要注意:Jetty的日期格式中,mm代表分钟,MM才代表月份。如果你的日志是按天分割的,那文件名里的mm肯定是笔误,得改成MM,同时显式设置filenameDateFormat和文件名完全一致。
修正后的完整配置示例
RequestLogHandler requestLogHandler = new RequestLogHandler(); NCSARequestLog requestLog = new NCSARequestLog(); // 修正文件名的月份格式为MM(代表月份) String filename = System.getProperty("user.dir") + "/logs/http-yyyy_MM_dd.log"; requestLog.setFilename(filename); // 必须设置和文件名完全匹配的日期格式 requestLog.setFilenameDateFormat("yyyy_MM_dd"); // 设置保留1天,超过24小时的旧日志会被清理 requestLog.setRetainDays(1); // 启用日志追加(默认是true,建议保持,避免覆盖日志) requestLog.setAppend(true); // 关联日志到Handler,并添加到Jetty的Handler链中 requestLogHandler.setRequestLog(requestLog); Server server = new Server(8080); server.setHandler(requestLogHandler); // 启动服务 server.start();
其他排查要点
- 手动触发清理验证:如果配置改完还是没自动删除,可以在启动后手动调用
requestLog.deleteOldLogs();。如果手动调用能删掉,说明是自动清理任务的触发时机问题——Jetty默认每天凌晨0点执行清理,修改系统时间后要确保时间已经过了0点,或者等触发时间到来。 - 文件权限检查:确保Jetty运行的用户拥有日志目录的读写删除权限,不然即使逻辑正确,也会因为权限不足删不掉文件。
- 版本bug排查:Jetty 9.2.22是2017年发布的老版本,如果上面的配置都没问题,可以查一下Jetty官方的bug记录,看看是否存在该版本特有的retainDays失效问题,必要时可以升级到9.2.x的最新小版本(比如9.2.29)试试。
内容的提问来源于stack exchange,提问作者Rajesh Waran




