SLF4J按标记过滤日志消息

时间:2019-05-23 13:14:34

标签: java spring spring-boot logging slf4j

我在应用程序中使用Spring Boot和Slf4j。我需要记录特定的审核事件。使用JPA,Hibernate或Spring Data JPA进行审核不符合我的需求,因为我想记录服务级别审核而不是数据库。因此,我决定将Markers与记录器一起使用,然后将其持久保存到数据库中。

但是,如何中断所有日志消息并过滤具有审核标记的日志消息?总之,它们也应该像没有标记的文件一样登录到文件中。

1 个答案:

答案 0 :(得分:0)

数据库Appender

Spring使用Logback作为底层日志框架。

您可以在logback-spring.xml中创建一个src/resources文件,然后配置记录器。有默认的FILE附加程序,您可以添加DATABASE附加程序

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <springProperty name="spring.datasource.driverClassName" source="spring.datasource.driverClassName"/>
    <springProperty name="spring.datasource.url" source="spring.datasource.url"/>
    <springProperty name="spring.datasource.username" source="spring.datasource.username"/>
    <springProperty name="spring.datasource.password" source="spring.datasource.password"/>

    <appender name="DATABASE" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <driverClass>${spring.datasource.driverClassName}</driverClass>
            <url>${spring.datasource.url}</url>
            <user>${spring.datasource.username}</user>
            <password>${spring.datasource.password}</password>
        </connectionSource>
    </appender>

    <logger name="AUDIT" level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="DATABASE"/>
    </logger>
 </configuration>

其他信息

您可以使用映射的诊断上下文(MDC)存储要添加到每个日志条目的全局信息:

MDC.put("username", SecurityContextHolder.getContext().getAuthentication().getName());

要在输出中包含它,必须将其添加到日志模式中。例如:

<Pattern>%X{username} - %m%n</Pattern>

进一步阅读

我建议阅读logback手册以获取有关appender和MDC的更多信息:

https://logback.qos.ch/manual/mdc.html