log4j:当我从另一个类调用记录器时,在日志中显示的类名称不正确

时间:2014-02-21 13:08:12

标签: java logging log4j

基本上,当使用log4j时,我知道我们必须使用Logger.getLogger(MyClass.class)或Logger.getLogger(“MyClass”)来启动Logger。

我有太多的课程,我不想在每个课程中添加这个陈述。相反,我喜欢做的就是这个

Logger.info(this,"My message");

其中Logger是我编写的一个类(不是log4j中的那个),它反过来启动一个Logger类型的对象(org.apache.log4j.Logger)并继续传递消息。

这是我的Logger.java

package com.mypackage;

/**
 * @author Sriram Sridharan
 *Custom logging implementation using log4j
 */
public class Logger {
private static org.apache.log4j.Logger logger;

    /**
     * Writes an INFO log
     * @param oClass
     * @param message
     */
    public static void INFO(Object oClass, String message){

org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(oClass.getClass());
    logger.info(message);
}
}

现在,我有自己的类,它调用此Logger实现来记录事件。看起来像这样

public class MyClass {

    public void myMethod(){
        com.mypackage.Logger.INFO(this, "Hello, World");
    }
}

我没有日志问题。他们很好。但是,日志中显示的类名称是相同的(Logger)。这是输出

 INFO [main] (Logger.java:18) - Hello, World

我期待这个

 INFO [main] (MyClass.java:18) - Hello, World

我哪里错了?

3 个答案:

答案 0 :(得分:9)

使用%c模式输出类别/ getLogger("myCategory") /而不是打印来电者类的%C

这个想法是你有通用的方法:

public static void debug(String category, String message) {
    Logger logger = org.apache.log4j.Logger.getLogger(category);
    logger.debug(message);
}

并且您的log4j配置包含您的模式:

%d{ISO8601} %c %m %n

这将打印

2014-02-21 14:38:120 YourCategory Your Message

因此,您不需要为每个具有日志的类实现Logger的实例化。

答案 1 :(得分:0)

您在logger.info(message);内使用Logger class,因此您将始终Logger.java进入日志文件。

您可以在要记录的类中记录消息,将记录类名。

答案 2 :(得分:0)

在获取log4j记录器时不使用class参数,因此log4j假定您的记录器类。 尝试

public static void INFO(Object oClass, String message){
   org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(oClass.getClass());
   logger.info(message);
}

代替。