方法名称在Java中的log4j logger中无法正确打印

时间:2014-03-06 19:21:27

标签: java logging log4j method-names

我的日志发生在getParam()方法中。但它记录为main方法。我有三个对象,但我没有看到有关哪个对象正在记录的任何信息。我也想要这些信息。

这是输出:

INFO  [main]: info
INFO  [main]: debug
INFO  [main]: trace

这是代码:

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

class Log4jTest {

    private static Logger log=Logger.getLogger(Log4jTest.class);
    private String param;

    public Log4jTest(String param){
        this.param=param;
    }

    public String getParam(){
        log.info(param);
        return param;
    }

}

public class Log4j_testing {
    public static void main(String[] args) throws FileNotFoundException{
        Log4jTest l1= new Log4jTest("info");
        l1.getParam();
        Log4jTest l2= new Log4jTest("debug");
        l2.getParam();
        Log4jTest l3= new Log4jTest("trace");
        l3.getParam();
    }
}

我的log4j.properties:

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.stdout.layout.ConversionPattern=%-5p [%t]: %m%n

另一方面:  如果我将上述注释行取消注释并且最后一行注释掉,我会得到

11:19:41,586  INFO Log4jTest:19 - info
11:19:41,589  INFO Log4jTest:19 - debug
11:19:41,589  INFO Log4jTest:19 - trace

它给出正在记录的正确行号(19),但不是正确的方法。

3 个答案:

答案 0 :(得分:6)

%M添加到您的模式中。但是,正如JavaDoc中所述:“生成调用者位置信息非常慢,应该避免,除非执行速度不是问题。”

答案 1 :(得分:3)

在某些情况下,某些模式被忽略或从未被记录(%C%F%l%L,{{1 }})。使用异步记录器和异步appender时也是如此。以下是user guide for Log4j 2.x对此所述的内容(参见第187页):

  

如果其中一个布局配置了与位置相关的属性   像HTML locationInfo,或其中一个模式%C或$ class,%F或   %file,%l或%location,%L或%line,%M或%方法,Log4j将采用   堆栈的快照,并遍历堆栈跟踪以查找位置   信息。   [...]采用堆栈跟踪快照的性能影响甚至更高   对于异步记录器:使用位置记录的速度要慢4到20倍   比没有位置。出于这个原因,异步记录器和   默认情况下,异步appender不包含位置信息

     

您可以覆盖记录器中的默认行为或异步   appender配置通过指定%M

答案 2 :(得分:0)

PatteryLayout的文档告诉我们%M将提供发出日志记录请求的方法名称,但我无法让它工作并最终输入方法名称在日志消息中。