#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]