Статьи

Простое и последовательное именование Log4j2 Logger

В посте « Переносимые имена логгеров с дескрипторами методов Java 7 » я писал об использовании дескрипторов методов Java 7 для именования логгеров классов. В этом посте я заявил, что преимущества этого подхода включают согласованность в именовании регистратора и предотвращение случайного копирования и вставки кода, которые могут привести к тому, что имя другого класса используется для имени регистратора. В этой статье я расскажу о том, как Log4j 2 обеспечивает подход для достижения этих же преимуществ.

Log4j 2 признает распространенный подход к именованию регистраторов, основанных на именах классов. Раздел « Имена регистраторов » страницы « Log4j 2 API » в Руководстве по Log4j 2 гласит: «В большинстве случаев приложения присваивают имена своим регистраторам, передавая имя текущего класса в LogManager.getLogger. Поскольку это использование очень распространено, Log4j 2 предоставляет его как значение по умолчанию, когда параметр имени регистратора либо пропущен, либо имеет значение null ».

Следующий очень простой класс Calculator демонстрирует это, создав Logger с LogManager без параметров . вызов getLogger () . Поскольку ни один параметр не передается getLogger() , логгер будет назван в честь класса, в котором он создан. Комментарий Javadoc для метода LogManager.getLogger () подтверждает следующее: «Возвращает Logger с именем вызывающего класса».

Calculator.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package dustin.examples.log4j;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
import java.util.Arrays;
 
 
/**
 * Simple calculator class that is intended more for demonstration
 * of Log4j2 than for calculating anything.
 */
public class Calculator
{
   private static final Logger logger = LogManager.getLogger();
 
   public String getLoggerName()
   {
      return logger.getName();
   }
 
   /**
    * Add the provided operands together and provide their sum.
    *
    * @param operands Operands to be added together.
    * @return Sum of the provided operands.
    */
   public long add(final long ... operands)
   {
      long sum = 0;
      for (final long operand : operands)
      {
         sum += operand;
      }
      logger.debug("The sum of " + Arrays.toString(operands) + " is " + sum);
      return sum;
   }
}

С классом Calculator реализованным, как показано выше, имя регистратора класса, доступное по вызову Logger.getName (), как показано в методе Calculator getLoggerName() , представляет собой «dustin.examples.log4j.Calculator». Хотя здесь это и не показано, Logger полученный с помощью LogManager.getFormatterLogger () без параметров , также будет использовать «полное имя вызывающего класса в качестве имени Logger».

Вывод

Подход Log4j 2, обсужденный и продемонстрированный в этом посте, для именования регистраторов прост в использовании и позволяет легко иметь согласованные и правильные имена регистраторов, предполагая, что выбранная схема именования регистратора должна использовать полностью определенное имя пакета и класса. Этот подход является более коротким и, возможно, даже более читабельным, чем метод обрабатывает подход к именованию регистраторов , но этот подход специфичен для Log4j 2, в то время как метод обработки метода может использоваться с несколькими каркасами и библиотеками журналирования.