Log4j, patternLayout, класс и категория - PullRequest
12 голосов
/ 19 октября 2011

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

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

Может кто-нибудь дать мне пример, где эти два будут разными?

Разве категория не всегда совпадает с именем класса?

С уважением,

1 Ответ

18 голосов
/ 22 октября 2011

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