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

14

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

我目前正在使用Undertow与Spring Boot,但检查了Spring Boot源代码后发现,Undertow记录器是使用DefaultAccessLogReceiver进行初始化的,该记录器会将日志写入文件。如果可能,我想使用AccessLogHandler并避免编写记录访问的Web过滤器。

除了编写拉取请求外,是否有任何简单的解决方法?

2个回答

7
对于这种硬编码的、因此无法自定义的问题的一个技巧是隐藏该类,并用具有相同包和名称的新类替换它。您只需要提供一个基于log4j的DefaultAccessLogReceiver,并确保在undertow库中的类加载器之前可以搜索到它即可。
package io.undertow.server.handlers.accesslog;

public class DefaultAccessLogReceiver implements AccessLogReceiver {

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

这是一个有趣的想法,我从未考虑过这个想法。 - Rowanto
1
还需要定义兼容的构造函数,这样它才能正常工作。 - Fleshgrinder
@thirstycrow 怎样将日志信息重定向到access_log.log文件而不是log4j日志文件? - Akash Shinde

-2

Spring Boot没有强制的日志依赖,但是有许多commons-logging API的实现可供选择。如果要使用Logback,则需要将其包含在类路径中,同时需要一些针对commons-logging的绑定。最简单的方法是通过启动器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版本。如果您没有使用starter poms,则需要额外提供commons-logging(至少)以及您选择的Log4j版本。
最简单的方法可能是通过启动器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。

1
我知道这个。但它不允许你将访问日志记录到控制台,并更改其设置。访问日志使用undertow的本地记录器。 - Rowanto
你能否从你的应用程序中举出一个例子,说明你想要做什么。在我们的应用程序中,我们可以在控制台上查看日志。 - AGdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接