gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:33 26 4
gpt4 key购买 nike

我有一个类在代表它的构造函数中接受字符串参数。

我想在日志消息中附加这个字符串作为前缀。我怎样才能在 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...

最佳答案

我不知道你目前是如何实例化你的logger的,但是你可以使用你的“string parameter which represents”你的对象来命名这个记录器:

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是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...");

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

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

关于java - 如何配置 logback 为每个对象附加特殊前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24931940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com