eag*_*arn 2 java logging log4j method-names
我的日志发生在getParam()方法中.但它被记录为main方法.我有三个对象,但我没有看到有关哪个对象正在记录的任何信息.我也想要这些信息.
这是输出:
INFO [main]: info
INFO [main]: debug
INFO [main]: trace
Run Code Online (Sandbox Code Playgroud)
这是代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的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
Run Code Online (Sandbox Code Playgroud)
另请注意:如果我将上面的注释行取消注释并且最后一行注释掉,我会得到
11:19:41,586 INFO Log4jTest:19 - info
11:19:41,589 INFO Log4jTest:19 - debug
11:19:41,589 INFO Log4jTest:19 - trace
Run Code Online (Sandbox Code Playgroud)
它给出了正确记录的行号(19),但没有给出正确的方法.
在某些情况下,某些模式会被忽略或从未记录(%C, %F, %l, %L, %M)。使用异步记录器和异步附加器时确实如此。以下是Log4j 2.x 用户指南对此的说明(参见第 217-218 页):
如果其中一个布局配置了与位置相关的属性,例如 HTML locationInfo,或者模式 %C 或 %class、%F 或 %file、%l 或 %location、%L 或 %line、%M 或 % 之一方法中,Log4j 将拍摄堆栈快照,并遍历堆栈跟踪以查找位置信息。
这是一项昂贵的操作:同步记录器慢 1.3 - 5 倍。同步记录器在拍摄此堆栈快照之前会等待尽可能长的时间。如果不需要位置,则永远不会拍摄快照。
但是,异步记录器需要在将日志消息传递到另一个线程之前做出此决定;该点之后位置信息将丢失。对于异步记录器来说,拍摄堆栈跟踪快照对性能的影响甚至更高:使用 location 进行日志记录比不使用 location 慢 30-100 倍。因此,异步记录器和异步追加器默认不包含位置信息。
您可以通过指定 来覆盖记录器或异步附加程序配置中的默认行为
includeLocation="true"。
| 归档时间: |
|
| 查看次数: |
9612 次 |
| 最近记录: |