Ego*_*yer 14 logging spring logback access-log spring-boot
我配置logback.xml
它完美但logback-access.xml
不起作用.
在maven pom.xml
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在 src/main/resource
logback.xml
logback-access.xml
Run Code Online (Sandbox Code Playgroud)
有没有办法配置访问日志?
对于嵌入式Jetty,您也可以将其作为Spring Boot配置的一部分来编写:
@Bean
public EmbeddedServletContainerFactory jettyConfigBean() {
JettyEmbeddedServletContainerFactory jef = new JettyEmbeddedServletContainerFactory();
jef.addServerCustomizers(new JettyServerCustomizer() {
public void customize(Server server) {
HandlerCollection handlers = new HandlerCollection();
for (Handler handler : server.getHandlers()) {
handlers.addHandler(handler);
}
RequestLogHandler reqLogs = new RequestLogHandler();
NCSARequestLog reqLogImpl = new NCSARequestLog("./logs/access-yyyy_mm_dd.log");
reqLogImpl.setRetainDays(30);
reqLogImpl.setAppend(true);
reqLogImpl.setExtended(false);
reqLogImpl.setLogTimeZone("GMT");
reqLogs.setRequestLog(reqLogImpl);
handlers.addHandler(reqLogs);
server.setHandler(handlers);
// For Jetty 9.3+, use the following
//RequestLogHandler reqLogs = new RequestLogHandler();
//reqLogs.setServer(server);
//RequestLogImpl rli = new RequestLogImpl();
//rli.setResource("/logback-access.xml");
//rli.setQuiet(false);
//rli.start();
//reqLogs.setRequestLog(rli);
//handlers.addHandler(reqLogs);
//server.setHandler(handlers);
}
});
return jef;
}
Run Code Online (Sandbox Code Playgroud)
您必须在服务器容器中包含相关功能.例如,对于Tomcat LogbackValve
,在EmbeddedServletContainerCustomizer
bean中添加一个.该TomcatEmbeddedServletContainerFactory
有一个addContextValves
用于此目的的方法.
经过几个小时试图获得SpringBoot 1.4 + Jetty + Logback访问的解决方案后,我终于找到了解决我的困境的答案.
Jetty的API接口在v9.3中已更改,Logback-access不再有效.
Logback项目中有一个pull请求可以让它再次运行.
https://github.com/qos-ch/logback/pull/269
在上面的pull请求中提到了几个解决方案.
选项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);
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
这可以工作但是您丢失了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>
Run Code Online (Sandbox Code Playgroud)
选项2
上面的pull请求中还提到了一个问题的修复,可以在它被排序之前使用.
创建一个添加缺少接口的类,并使用它而不是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 {
Run Code Online (Sandbox Code Playgroud)
}
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);
Run Code Online (Sandbox Code Playgroud)
我试过这两个,最后现在选择2,因为我已经花了太多时间.我更喜欢选项1,所以我可以将所有日志配置保存在同一个文件中.
祝好运.