Dropwizard 1.3.8中HTTP请求日志写入文件问题求助
看起来你踩了Dropwizard日志配置里一个很容易混淆的坑:HTTP请求日志和应用程序日志是完全分开配置的!你之前只配置了应用日志的文件输出,而请求日志默认只打在控制台,这就是文件里看不到请求日志的核心原因。下面一步步帮你解决:
1. 核心修正:区分应用日志与HTTP请求日志的配置节点
Dropwizard里,logging节点负责管理应用代码中通过logger输出的日志(比如你自己代码里的LOG.debug()),而HTTP请求日志(就是你控制台看到的GET /api/orders这类日志)是由server.requestLog节点单独配置的。
你之前的config.yml完全没配置server.requestLog的文件输出,所以请求日志只会默认输出到控制台,不会写入文件。
修正后的完整config.yml示例
server: # 专门配置HTTP请求日志的部分 requestLog: appenders: # 把请求日志写入独立文件 - type: file currentLogFilename: /home/nikola/Documents/DWApp-LOGs/DW-Bookshop_REQUESTS.log threshold: ALL archive: true archivedLogFilenamePattern: /home/nikola/Documents/DWApp-LOGs/DW-Bookshop_REQUESTS-%d.log archivedFileCount: 5 timeZone: UTC # 这里使用logback-access的HTTP专用转换词 logFormat: "%h %l %u [%t] \"%r\" %s %b \"%i{Referer}\" \"%i{User-Agent}\"" # 同时保留控制台输出(可选) - type: console logFormat: "%h %l %u [%t] \"%r\" %s %b \"%i{Referer}\" \"%i{User-Agent}\"" # 原有的应用日志配置保持不变 logging: level: INFO loggers: com.nikolas.master_thesis: DEBUG appenders: - type: file currentLogFilename: /home/nikola/Documents/DWApp-LOGs/DW-Bookshop_APP.log threshold: ALL queueSize: 512 archive: true archivedLogFilenamePattern: /home/nikola/Documents/DWApp-LOGs/DW-Bookshop_APP-%d.log archivedFileCount: 5 timeZone: UTC logFormat: "%-5p [%d{ISO8601,UTC}] %c: %m%n%rEx" bufferSize: 8KB immediateFlush: true - type: console threshold: ALL queueSize: 512 discardingThreshold: 0 timeZone: UTC target: stdout logFormat: "%-5p [%d{ISO8601,UTC}] %c: %m%n%rEx"
2. 正确的HTTP请求日志格式(logback-access转换词)
你之前遇到的NumberFormatException和转换词无效问题,是因为把logback-access的HTTP专用转换词错误用到了应用日志的logFormat里:
- 应用日志的
logFormat使用普通logback转换词(比如%p、%d、%c) - HTTP请求日志的
logFormat必须使用logback-access的专用转换词,常用的有:%h:客户端IP地址%l:远程登录名(通常为-,多数请求无登录)%u:认证后的用户名(无则为-)%t:请求时间%r:完整请求行(如GET /api/orders HTTP/1.1)%s:响应状态码%b:响应大小(无内容则为-)%i{HeaderName}:获取指定请求头的值(如%i{User-Agent})
上面示例中的logFormat就是标准的NCSA请求日志格式,完全符合你的需求,不会触发报错。
3. logback.xml的放置位置
如果需要自定义更复杂的日志规则(比如自定义过滤器、异步appender、多环境配置),才需要用到logback.xml。在Maven项目中,直接把它放在src/main/resources目录下即可,Dropwizard启动时会自动加载该路径下的配置文件。
不过如果只是实现请求日志与应用日志的分离输出,用Dropwizard自带的YAML配置就足够了,不需要额外的logback.xml。
最后验证
启动应用后,你会看到两个独立的日志文件:
DW-Bookshop_APP.log:记录应用代码输出的业务日志DW-Bookshop_REQUESTS.log:记录所有HTTP请求的访问日志
控制台也会同时输出两种日志,完全符合你的预期。
内容的提问来源于stack exchange,提问作者NikolaS

