使用 MDC 的 JOOQ 日志

Posted

技术标签:

【中文标题】使用 MDC 的 JOOQ 日志【英文标题】:JOOQ log with MDC 【发布时间】:2020-12-14 22:10:07 【问题描述】:

我使用logback MDC来记录我的应用程序不同模块的日志,例如,

// 1. define a logger
org.slf4j.Logger mdclog = org.slf4j.LoggerFactory.getLogger("MY_LOGGER_NAME");

// record trade log
org.slf4j.MDC.put("MY_MDC_KEY", "trade_log");
mdclog.info("This is trade log");

// record goods log
org.slf4j.MDC.put("MY_MDC_KEY", "goods_log");
mdclog.info("This is goods log");

logback.xml 中的 mdc 配置

<appender name="log_classify" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <Key>login</Key> 
            <DefaultValue>OTHER</DefaultValue>
        </discriminator>
        <sift>
            <appender name="$MY_MDC_KEY" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <prudent>false</prudent>
                <file>$LOG_PATH/$MY_MDC_KEY.log</file>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>$LOG_PATH/$MY_MDC_KEY_%dyyyy-MM-dd.log.zip</fileNamePattern>
                </rollingPolicy>
                <encoder>
                    <pattern>$FILE_LOG_PATTERN</pattern>
                </encoder>
            </appender>
        </sift>
</appender>

这会生成两个日志文件,

我想在不同的日志文件中记录贸易或货物的sql日志, 所以我想知道 JOOQ 是否支持这个?

【问题讨论】:

【参考方案1】:

我找到了解决问题的方法。

我将附加程序放入org.jooq.tools.LoggerListener

    <Logger name="org.jooq.tools.LoggerListener" level="DEBUG">
        <appender-ref ref="log_classify" />
    </Logger>

初始化我的 MDC 后,jooq sql 执行日志将添加到不同的文件中。

其实,我不知道这是不是个好主意

【讨论】:

【参考方案2】:

jOOQ 没有将它与开箱即用的记录器深度集成,但您可以在运行 SQL 查询之前将 org.slf4j.MDC.put 调用放在 ExecuteListener 中,例如在 ExecuteListener::renderEnd 事件中,一旦 SQL生成语句,并对查询进行正则表达式匹配以做出决定。或者,使用VisitListener,您可以提前做出此决定,尝试匹配查询中可能存在的特定表。

但很可能,初始化MDC 上下文的更好位置是在服务层,因为您的服务也可能知道您是否要运行“贸易”或“货物”查询。

【讨论】:

嗨,卢卡斯,感谢您的回答。我找到了解决我的问题的方法。我在问题的末尾添加它。但我不知道这是不是个好主意, @einherjar:你可以自己回答问题

以上是关于使用 MDC 的 JOOQ 日志的主要内容,如果未能解决你的问题,请参考以下文章

使用 Logback MDC 进行 Spring Boot ErrorController 日志记录

基于Slf4j的MDC实现日志链路串联

基于Slf4j的MDC实现日志链路串联

log4j MDC用户操作日志追踪配置

如何通过 MDC 将从 JWT 获取的用户 ID 添加到后端日志?

MDC仅用于记录吗?