经过数小时尝试找到与 SpringBoot 1.4 + Jetty + Logback-access 一起使用的解决方案后,我终于找到了解决问题的方法。
Jetty 的 API 接口在 v9.3 中发生了变化,Logback-access 不再起作用。
http://shibboleth.1660669.n2.nabble.com/Jetty-9-3-access-logging-recommended-configuration-td7620755.html
Logback 项目中有一个拉取请求,以使其再次工作。
https://github.com/qos-ch/logback/pull/269
上面的拉取请求中提到了几个解决方案。
选项 1。
使用 org.eclipse.jetty.server.Slf4jRequestLog 实现将日志配置路由回经典 Logback。
码头配置@Bean
RequestLogHandler requestLogsHandler = new RequestLogHandler();
requestLogsHandler.setServer(server);
Slf4jRequestLog log = new Slf4jRequestLog();
log.setLoggerName("com.example.accesslog");
requestLogsHandler.setRequestLog(log);
handlers.addHandler(requestLogsHandler);
server.setHandler(handlers);
logback.xml
<appender name="FILE-ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/main.log</file>
<encoder>
<!-- You'll have to work this out -->
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/main.%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>14</maxHistory>
</rollingPolicy>
</appender>
<logger name="com.example.accesslog">
<appender-ref ref="FILE-ACCESS" />
</logger>
这可行,但是您会丢失 Logback-access 可用的自定义 PatternLayout 中的所有访问日志特定参数。您可能需要推出自己的模式类。
认为这可能有效,但它没有(或者我没有正确地做到这一点)。
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.access.PatternLayout">
<pattern>%h %l %u [%t] "%r" %s %b "%i{Referer}" "%i{User-Agent}"</pattern>
</layout>
</encoder>
选项 2
在上面的拉取请求中还提到了对问题的修复,可以在它被排序之前使用。
创建一个添加缺失接口的类,并使用它代替 RequestLogImpl。
新班级
package com.example.ch.qos.logback.access.jetty;
import ch.qos.logback.access.jetty.RequestLogImpl;
import org.eclipse.jetty.util.component.LifeCycle;
public class LogbackAccessRequestLogImplFix1052 extends RequestLogImpl implements LifeCycle {
}
码头配置@Bean
RequestLogHandler requestLogs = new RequestLogHandler();
requestLogs.setServer(server);
LogbackAccessRequestLogImplFix1052 rli = new LogbackAccessRequestLogImplFix1052();
rli.setResource("/logback-access.xml");
rli.setQuiet(false);
requestLogs.setRequestLog(rli);
handlers.addHandler(requestLogs);
server.setHandler(handlers);
我尝试了这两种方法并最终选择了选项 2,因为我已经花了太长时间了。不过,我更喜欢选项 1,因此我可以将所有日志记录配置保存在同一个文件中。
祝你好运。