使用 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 日志记录