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

时间:2016-08-01 18:36:51

标签: java log4j slf4j

我正在尝试使用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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

我通过使用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

答案 1 :(得分:0)

如果您正在使用PatternLayout(您应该),可以通过将模式定义为

来实现
%C{1}:%M - %m%n