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

Java log4j为来自一个抽象类的所有消息添加前缀,java,log4j,slf4j,Java,Log4j,Slf4j,我试图使用log4j为所有日志命令添加前缀 以前我一直在所有类前面使用@Slf4j,但现在我需要为所有消息添加特定前缀,所以这不再可能 我的班级结构如下: abstract class MyAbstractClass { protected final MyLogger log; MyAbstractClass(String foodType) { this.log = new MyLogger(Logger.getLogger(this.getClass(),

我试图使用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就是这样做的)

我有办法做到这一点吗

谢谢

如果您正在使用(并且应该使用),可以通过定义要使用的模式来实现这一点

%C{1}:%M - %m%n

我使用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的信息,请点击这里:

与包装
log4j
记录器相比,您为什么不做一些类似
log.info(foodType+“:hehe”)
?此外,我看不到为
[info]MyLogger#info
生成
#info
的位置。它是否在
模式布局中定义?如果是这样的话,也可以发布。@bradimus我可以使用log.info(食物类型+):“+msg)方法,但是当我有很多日志调用时,这是非常重复的。我只是想要一个更干净的方式来做这个哈哈。另外,我不知道PatternLayout,你能提供更多的信息吗#之所以生成info,是因为log4j日志调用是从MyLogger.info进行的。log4j似乎在跟踪它对MyLogger函数的日志调用,而不是调用日志函数的实际方法(MyClass1.myMethod1和MyClass2.myMethod2)。@bradimus这是完整的模式布局(我做了一些修改,仍然无法打印汉堡和比萨饼):%d{yyyyyy-MM-dd HH:MM:ss,SSS}[%-5p]%c{1}#%M-%n问题解决了吗?根据上面的模式,我得到了正确的输出。你能扩展一下吗?我不太清楚PatternLayout@Blee这是一个很好的布局教程。这不管用。仍然打印MyLogger的信息。下面是我创建的模式:%d{yyyy-MM-dd HH:MM:ss,SSS}[%-5p]%c{1}#%M-%M%nI还应该添加一点,我希望能够控制XML中各个类的日志记录级别。目前,在我的log4j.xml中,我只有这样一个:
我无法控制单个类(MyClass1,MyClass2)@Blee它是大写的
C
在您的模式中是一个小的
C
abstract class MyAbstractClass {
    protected final Logger log;
    MyAbstractClass(String foodType) {
        MDC.put("myfood", foodType);
        this.log = LoggerFactory.getLogger(getClass()));
    }
}