我的日志发生在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),但不是正确的方法。
发布于 2014-03-07 03:32:42
将%M添加到您的模式。但是,正如JavaDoc中所述:“生成调用者位置信息非常慢,应该避免,除非执行速度不是问题。”
发布于 2016-04-13 07:12:55
在某些情况下,某些模式被忽略或从未记录(%C、%F、%l、%L、%M)。这在使用异步记录器和异步附加器时是正确的。以下是user guide for Log4j 2.x对此的看法(参见第217-218页):
如果其中一个布局配置了与位置相关的属性,如HTML,或模式%C或% locationInfo、%F或%file、%l或%location、%L或%line、%M或%method,则Log4j将拍摄堆栈快照,并遍历堆栈跟踪以查找位置信息。
这是一个昂贵的操作:同步记录器的速度要慢1.3 -5倍。同步记录器在获取此堆栈快照之前尽可能长时间地等待。如果不需要位置,则永远不会拍摄快照。
但是,异步记录器需要在将日志消息传递到另一个线程之前做出此决定;在此之后,位置信息将丢失。对于异步日志记录器,获取堆栈跟踪快照的性能影响甚至更高:有位置的日志记录速度比没有位置的慢30-100倍。因此,异步记录器和异步附加器默认情况下不包含位置信息。
您可以通过指定includeLocation="true".来覆盖记录器或异步附加器配置中的默认行为
发布于 2015-02-15 13:28:40
PatteryLayout的文档告诉我们,%M将提供发出日志请求的方法名称,但我一直无法使其工作,最终将方法名称放在日志消息中。
https://stackoverflow.com/questions/22233965
复制相似问题