gpt4 book ai didi

java - log4j 为来自一个抽象类的所有消息添加前缀

转载 作者:行者123 更新时间:2023-11-30 02:50:51 26 4
gpt4 key购买 nike

我正在尝试使用 log4j 为所有日志命令添加前缀。

以前我一直在所有类前面使用@Slf4j,但现在我需要为所有消息添加某些前缀,所以这不再可能。

我的类结构如下:

abstract class MyAbstractClass {
protected final MyLogger log;
MyAbstractClass(String foodType) {
this.log = new MyLogger(Logger.getLogger(this.getClass(), foodType));
}
}

class MyClass1 extends MyAbstractClass {
MyClass1(String foodType) { super(foodType); }
public static void myMethod1() {
log.info("hehe");
}
}

class MyClass2 extends MyAbstractClass {
MyClass2(String foodType) { super(foodType); }
public static void myMethod2() {
log.info("hohohoho");
}
}

/* MyLogger.java */

@Slf4j
public class MyLogger {
private final Logger LOGGER;
private String PREFIX;
public MyLogger(Logger logger, String foodType) {
LOGGER = logger;
PREFIX = foodType + ": ";
}

public void info(final String str) {
log.info(PREFIX + str);
}

public void warn(final String str) {
log.warn(PREFIX + str);
}

public void debug(final String str) { log.debug(PREFIX + str); }

public void error(final String str) {
log.error(PREFIX + str);
}

public void error(final String str, Exception e) {
log.error(PREFIX + str, e);
}
...

// i know.. it's so inconvenient because I have to override all the methods that I want to use from log4j Logger. I wish there is an alternative.

}

如果我要做这样的事情

public static void main() {
MyClass1 c1 = new MyClass1("burger");
MyClass2 c2 = new MyClass2("pizza");
c1.myMethod1();
c2.myMethod2();
}

我会得到这样的东西。

/* console */
[INFO] MyLogger#info - burger: hehe
[INFO] MyLogger#info - pizza: hohoho

但是,我希望得到这样的东西,以便能够追踪它到底来自哪里(原始 Log4j 就是这样做的)。

/* console */
[INFO] MyClass1#MyMethod1 - burger: hehe
[INFO] MyClass2#MyMethod2 - pizza: hohoho

我有办法实现这个目标吗?

谢谢!

最佳答案

我通过使用 MDC 模式解决了这个问题。我不再需要 MyLogger 类。我可以使用 Log4j 的 Logger 类。

你可以做类似的事情

abstract class MyAbstractClass {
protected final Logger log;
MyAbstractClass(String foodType) {
MDC.put("myfood", foodType);
this.log = LoggerFactory.getLogger(getClass()));
}
}

在该模式中,您可以添加 %X{myfood} 来访问您设置的变量:)

有关 MDC 的更多信息:http://logback.qos.ch/manual/mdc.html

关于java - log4j 为来自一个抽象类的所有消息添加前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38705823/

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