Spring Boot jetty/tomcat嵌入式访问日志配置

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)

有没有办法配置访问日志?

alb*_*ano 8

对于嵌入式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)


Dav*_*yer 6

您必须在服务器容器中包含相关功能.例如,对于Tomcat LogbackValve,在EmbeddedServletContainerCustomizerbean中添加一个.该TomcatEmbeddedServletContainerFactory有一个addContextValves用于此目的的方法.


chr*_*acp 6

经过几个小时试图获得SpringBoot 1.4 + Jetty + Logback访问的解决方案后,我终于找到了解决我的困境的答案.

Jetty的API接口在v9.3中已更改,Logback-access不再有效.

http://shibboleth.1660669.n2.nabble.com/Jetty-9-3-access-logging-recommended-configuration-td7620755.html

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,所以我可以将所有日志配置保存在同一个文件中.

祝好运.