Log4j,patternLayout,类和类别

JBA*_*BAM 12 configuration log4j pattern-layout

log4j PatternLayout(log4j patternLayout)中使用时,我无法确定使用这两个log4j转换字符之间的确切区别

  • 类别(%c)
  • 班级(%C)

有人可以举个例子,说明这两个会有所不同吗?

类别是否始终与班级名称匹配?

问候,

MaD*_*aDa 18

如果您以文档建议的流行方式初始化记录器,并在X类中使用它,它将是相同的:

Logger logger = Logger.getLogger(com.foo.X.class);
Run Code Online (Sandbox Code Playgroud)

那么你会得到相同的%c%C,因为记录器名称(通过构建"com.foo.X.class.getName()"),将匹配其中的类名发出logging语句.

打电话给你的记录器"东西"

Logger logger = Logger.getLogger("something");
Run Code Online (Sandbox Code Playgroud)

你将拥有"东西" %c和类名%C.

注意,这%C是由当前线程的堆栈跟踪中的log4j计算出来的,因此它会带来很大的性能影响,不像%c是一个String.您可以进行有趣的实验来验证它:

package com.foo;

class A {
     private Logger = Logger.getLogger(B.class);
     // ...
     logger.log("inside A class");
}
Run Code Online (Sandbox Code Playgroud)

模式[%c][%m]假设的输出B在包com.foo中将是:

[com.foo.B][inside A class]
Run Code Online (Sandbox Code Playgroud)

[%C][%m]无论位置如何,模式的输出B将是:

[com.foo.A][inside A class]
Run Code Online (Sandbox Code Playgroud)