如何使用自定义记录器在spring boot中记录访问日志

时间:2016-02-25 00:57:27

标签: java spring spring-boot log4j2 undertow

目前在spring boot 1.3中,我们只能将访问日志记录到文件系统中的文件中。有没有办法实际使用自定义记录器(如log4j2)来记录访问日志?

我目前正在使用弹簧启动功能,但在检查弹簧启动源代码后,使用写入文件的DefaultAccessLogReceiver初始化进程记录器。我想尽可能使用AccessLogHandler,并避免编写记录访问权限的Web过滤器。

这有什么简单的方法吗? (除了写拉请求外)

2 个答案:

答案 0 :(得分:5)

这种硬编码因此不可定制的问题的一个技巧是隐藏类以使用具有相同包和名称的新类。您所要做的就是提供基于log4j的DefaultAccessLogReceiver 并确保它可以在下载库中的类加载器之前进行搜索。

package io.undertow.server.handlers.accesslog;

public class DefaultAccessLogReceiver implements AccessLogReceiver {

    public void logMessage(final String message) {
        // TODO: log with log4j
    }
}

答案 1 :(得分:-1)

Spring Boot没有强制的日志记录依赖性,除了commons-logging API,其中有许多实现可供选择。要使用Logback,您需要包含它,以及在类路径上记录commons的一些绑定。最简单的方法是通过启动器poms,它们都依赖于spring-boot-starter-logging。对于Web应用程序,您只需要spring-boot-starter-web,因为它依赖于日志记录启动器。例如,使用Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot有一个LoggingSystem抽象,它试图根据类路径的内容配置日志记录。如果Logback可用,则它是第一选择。

Spring Boot还支持Log4j或Log4j 2进行日志记录配置,但前提是其中一个位于类路径中。如果您使用starter poms来组合依赖项,则意味着您必须排除Logback,然后包含您选择的Log4j版本。如果你没有使用启动器poms,那么除了你选择的Log4j版本之外,还需要提供commons-logging(至少)。

最简单的路径可能是通过起动器poms,即使它需要一些与排除,j的晃动。在Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

要使用Log4j 2,只需依赖spring-boot-starter-log4j2而不是spring-boot-starter-log4j。