Log4j, patternLayout, класс и категория

У меня возникли проблемы с установлением точной разницы между использованием этих двух символов преобразования log4j при использовании в log4j PatternLayout (log4j patternLayout)

  • категория (% c)
  • класс (% C)

Может кто-нибудь, пожалуйста, дайте мне пример, где эти два будут отличаться?

Не всегда ли категория всегда соответствует имени класса?

Привет,

Ответ 1

Это будет то же самое, если вы инициализируете регистратор популярным способом, предложенным в документации, и используйте его внутри класса 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]