在 log4j PatternLayout (log4j patternLayout)
中使用这两个log4j转换字符时,我无法确定两者之间的确切区别有人可以举个例子说明这两个会不同吗?
类别是否始终与班级名称匹配?
此致
答案 0 :(得分:18)
如果您以文档建议的流行方式初始化记录器,并在X
类中使用它,它将是相同的:
Logger logger = Logger.getLogger(com.foo.X.class);
然后你会得到%c
和%C
的相同内容,因为记录器名称(由“com.foo.X.class.getName()”构造)将匹配类名称发出了日志声明。
将记录器称为“某事”
Logger logger = Logger.getLogger("something");
您将%c
拥有“内容”和%C
的类名。
请注意,%C
是由当前线程的堆栈跟踪中的log4j计算出来的,因此它会带来很大的性能影响,这与%c
不同,后者只是一个字符串。您可以进行有趣的实验来验证它:
package com.foo;
class A {
private Logger = Logger.getLogger(B.class);
// ...
logger.log("inside A class");
}
假设[%c][%m]
位于包B
中的模式com.foo
的输出将为:
[com.foo.B][inside A class]
无论[%C][%m]
的位置如何,模式B
的输出都是:
[com.foo.A][inside A class]