java - 在日志消息中引用 MDC 变量,而不是使用 Slf4j 和 Log4j 的模式

标签 java log4j slf4j mdc

是否可以在日志消息中引用 MDC 变量,而不是使用 slf4j 和 log4j-impl 的模式?

我有以下代码:

package example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.slf4j.MDC.MDCCloseable;

public class Stackoverflow {

    private static final Logger log = LoggerFactory.getLogger(Stackoverflow.class);

    public static void main(String[] args) {
        try (MDCCloseable _unused = MDC.putCloseable("url", "https://google.com/")) {
            log.info("blabla some log message url=%mdc{url}");
        }
    }
}

但是占位符%mdc{url}不会被替换。 我还尝试使用 %X{url}%MDC{url} (请参阅 https://logging.apache.org/log4j/2.x/manual/layouts.html )。

当更改 ConversionPattern 以包含这些占位符中的任何一个时,值将被替换。但我想引用消息中的变量而不是模式中的变量。

我的完整 log4j 配置如下所示:

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

我使用的是 slf4j 版本 1.7

最佳答案

您想要这样做似乎有点奇怪,因为 MDC 将由日志系统自动打印在您的消息旁边(使其再次打印变得多余),但您可以使用以下方式获取该值MDC.get :

log.info("blabla some log message url={}", MDC.get("url"));

关于java - 在日志消息中引用 MDC 变量,而不是使用 Slf4j 和 Log4j 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58837432/

相关文章:

java - 如何比较字符以检查它是否为空?

java - 与 Logstash 一起使用时在 log4j 上被阻止

java - 多个功能是 logback 标记的良好用例吗?

java - AWS 使用 SLF4J 记录单独的日志文件

java - 寻找碰撞面?

java - 如何将 FileInputStream 转换为 InputStream?

java - Log4j 无法在 maven War 项目的本地类路径中包含项目构建目录

java - 日志中缺少时间戳(JAVA)

java - 将大 CSV 文件加载到 SQLITE 数据库

java - 为什么Tomcat STDOUT 总是指向/dev/null?