You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

嵌入式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();

其他排查要点

  1. 手动触发清理验证:如果配置改完还是没自动删除,可以在启动后手动调用requestLog.deleteOldLogs();。如果手动调用能删掉,说明是自动清理任务的触发时机问题——Jetty默认每天凌晨0点执行清理,修改系统时间后要确保时间已经过了0点,或者等触发时间到来。
  2. 文件权限检查:确保Jetty运行的用户拥有日志目录的读写删除权限,不然即使逻辑正确,也会因为权限不足删不掉文件。
  3. 版本bug排查:Jetty 9.2.22是2017年发布的老版本,如果上面的配置都没问题,可以查一下Jetty官方的bug记录,看看是否存在该版本特有的retainDays失效问题,必要时可以升级到9.2.x的最新小版本(比如9.2.29)试试。

内容的提问来源于stack exchange,提问作者Rajesh Waran

火山引擎 最新活动