如何使用自定义记录器在弹簧启动中记录访问日志

2022-09-04 04:27:15

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

我目前正在使用带有spring boot的undertow,但是在检查了spring boot源代码之后,undertow记录器使用DefaultAccessLogReceiver初始化,该记录器正在写入文件。如果可能的话,我想使用AccessLogHandler,并避免编写记录访问的Web过滤器。

有什么简单的方法可以解决这个问题吗?(编写拉取请求除外)


答案 1

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

package io.undertow.server.handlers.accesslog;

public class DefaultAccessLogReceiver implements AccessLogReceiver {

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

答案 2

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

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

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

Spring Boot 还支持 Log4j 或 Log4j 2 进行日志记录配置,但前提是其中一个位于类路径上。如果您使用初学者pom来组装依赖项,这意味着您必须排除Logback,然后包括您选择的Log4j版本。如果您没有使用入门poms,那么除了您选择的Log4j版本之外,您还需要提供commons-loging(至少)。

最简单的路径可能是通过初学者poms,即使它需要一些带有排除的抖动,例如在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。


推荐