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

时间:2014-07-24 11:05:19

标签: java logging logback slf4j

我有一个类在其构造函数中使用string参数来表示它。

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

例如;

MyClass classA = new MyClass("0999445454");

MyClass classB = new MyClass("0999446464");

classA.doSomething();
classB.doSomething();

MyClass的方法;

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

     //Do something
}

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

[INFO] [0999445454]: Doing Something...
[INFO] [0999446464]: Doing Something...

1 个答案:

答案 0 :(得分:7)

我不知道您当前如何实例化logger,但您可以使用“字符串参数代表”您的对象来命名此记录器:

logger = LoggerFactory.getLogger("0999445454");

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

Logger logger = null;

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

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

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

<appender name="..." class="...Appender">
    <encoder>
        <pattern>[%level] [%logger]: %msg%n</pattern>
    </encoder>
</appender>

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


如果您想避免为每个ID创建Logger,您还可以使用Mapped Diagnostic Context(MDC):

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

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

<pattern>[%level] [%mdc{id}]: %msg%n</pattern>

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

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);
        }
    }
}