我有一个类在其构造函数中使用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...
答案 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);
}
}
}