如何配置logback以为每个对象附加特殊前缀?

Jma*_*man 6 java logging logback slf4j

我有一个类在其构造函数中采用字符串参数来表示它.

我想在日志消息中附加此字符串作为前缀.我怎么能在logback中做到这一点?

例如;

MyClass classA = new MyClass("0999445454");

MyClass classB = new MyClass("0999446464");

classA.doSomething();
classB.doSomething();
Run Code Online (Sandbox Code Playgroud)

MyClass的方法;

public void doSomething()  {
     logger.info("Doing Something...");

     //Do something
}
Run Code Online (Sandbox Code Playgroud)

所以我希望看到这样的日志消息;

[INFO] [0999445454]: Doing Something...
[INFO] [0999446464]: Doing Something...
Run Code Online (Sandbox Code Playgroud)

xav*_*xav 7

我不知道你当前是如何实例化你的logger,但你可以用你的"字符串参数代表"你的对象命名这个记录器:

logger = LoggerFactory.getLogger("0999445454");
Run Code Online (Sandbox Code Playgroud)

例如,如果此字符串标识符存储在属性中id,则可以执行以下操作:

Logger logger = null;

public MyClass(String id) {
    logger = org.slf4j.LoggerFactory.getLogger(id);
    // ...
}

public void doSomething()  {
    logger.info("Doing Something...");
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

然后,您需要在Logback配置文件中使用以下Pattern:

<appender name="..." class="...Appender">
    <encoder>
        <pattern>[%level] [%logger]: %msg%n</pattern>
    </encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)

因为%logger是记录器名称,它是给定的参数org.slf4j.LoggerFactory.getLogger()


如果要避免Logger为每个ID 创建一个,您还可以使用映射诊断上下文 (MDC):

logger = LoggerFactory.getLogger(MyClass.class);
org.slf4j.MDC.put("id", "your ID");
logger.info("Doing Something...");
Run Code Online (Sandbox Code Playgroud)

然后,您应%mdc在模式中添加字段(即Logback配置文件):

<pattern>[%level] [%mdc{id}]: %msg%n</pattern>
Run Code Online (Sandbox Code Playgroud)

因此,MDC.put()每次要使用其他ID登录时,都应在日志之前调用.在你的情况下你可以做的是:

public class MyClass {
    private Logger logger = LoggerFactory.getLogger(MyClass.class);
    private final String id;
    private static final Object MDC_MUTEX = new Object();

    public MyClass(String id) {
        this.id = id;
        // ...
    }

    public void doSomething()  {
        log("Doing Something...");
        // Do something...
    }

    private void log(String message) {
        synchronized(MDC_MUTEX) {
            MDC.put("id", id);
            logger.info(message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)