经过多个小时的尝试,我终于找到了一个适用于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。
JettyConfiguration @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>
</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 {
Jetty配置@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);
我尝试了两种方法,最终选择了第二种,因为我已经花了太长时间在这个问题上。不过,我更喜欢第一种方法,因为可以将所有的日志配置保存在同一个文件中。
祝你好运。