Log4j, шаблон, класс и категория

#configuration #log4j #pattern-layout

#конфигурация #log4j #шаблон-макет

Вопрос:

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