Рубрики
Без рубрики

Пример учебника Log4j2 – Конфигурация, Уровни, Приложения

Пример Log4j2. Учебник по Log4j2. Конфигурация Log4j2. log4j2.xml пример. Уровни Log4j2, Приложения Log4j2, Поисковые запросы, Фильтры, Макет, Отображение шаблонов.

Автор оригинала: Pankaj Kumar.

Добро пожаловать в учебник по примерам Apache Log4j2. Если вы спросите опытного разработчика о самой раздражающей вещи в приложении, ответ может быть связан с ведением журнала. Если в приложении нет подходящего входа в систему, обслуживание будет кошмаром.

Большая часть приложений проходит тестирование на разработку, модульное тестирование, интеграционное тестирование. Но когда дело доходит до производства, вы всегда будете сталкиваться с уникальными сценариями и исключениями. Таким образом, единственный способ выяснить, что произошло в конкретном случае, – это выполнить отладку с помощью журналов.

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

Пример учебника Log4j

В этом примере урока Log4j2 вы узнаете, как начать работу с Apache Log4j2 . Мы также рассмотрим архитектуру Log4j2, конфигурацию log4j2, уровни ведения журнала log4j2, приложения, фильтры и многое другое.

  1. Обзор Log4j2
  2. Архитектура Log4j2
  3. Конфигурация Log4j2
  4. Уровни Log4j2
  5. Поиск в журнале 4j2
  6. Приложения Log4j2
  7. Фильтры Log4j2
  8. Макеты Log4j2
  9. Какой уровень Log4j2 вы должны использовать
  10. Краткое описание учебного пособия Log4j2

Обзор Log4j2

Использование API ведения журнала в приложении-это не роскошь, это необходимо иметь. Log4j – это библиотека с открытым исходным кодом, которая опубликована и лицензирована под Программным обеспечением Apache .

Вы можете отлаживать приложение с помощью отладки Eclipse или некоторых других инструментов, но этого недостаточно и невозможно в рабочей среде.

Механизм ведения журнала предоставит вам несколько преимуществ, которых вы не найдете при обычной отладке.

Нет необходимости в человеческом вмешательстве Существует необходимость в человеческом вмешательстве Вмешательство человека
Может быть интегрирован с постоянным хранилищем (файлы, база данных, база данных NoSQL и т.д.) Не может быть интегрирован с постоянным хранилищем Стойкая Среда
Может быть использован для достижения аудита, если он используется эффективно Не может быть использован для достижения аудита Может использоваться для аудита
Достаточный Недостаточно; вы можете заблудиться в потоке. Достаточно для сложной структуры и потока
Более продуктивно Менее продуктивно Производительность

Как вы можете видеть выше, использование механизма ведения журнала будет более эффективным при меньших затратах на техническое обслуживание.

Apache Log4j-это передовой инструмент для входа в Java-приложения, поэтому вам следует его использовать.

Архитектура Log4j2

Прежде чем мы перейдем к учебнику по примеру Log4j, полезно изучить архитектуру Log4j2. На рисунке ниже показаны важные классы в API Log4j2.

Вот подробное объяснение архитектуры, показанной выше:

  • Приложения будут запрашивать LogManager для Регистратора с определенным именем.
  • LogManager найдет соответствующий LoggerContext и затем получит Logger из него.
  • Если регистратор еще не создан, он будет создан и связан с LoggerConfig в соответствии с тремя вариантами ниже:

    1. Экземпляр регистратора будет создан и связан с LoggerConfig , имеющим то же имя. Например App.class в getLogger(App.class) будет оцениваться как строка com.journaldev.Приложение . Имя LoggerConfig идентично полному имени класса (программный компонент).
    2. Экземпляр регистратора будет создан и связан с LoggerConfig , имеющим тот же родительский пакет регистраторов. Например com.journaldev в getLogger("com.journaldev")
    3. Экземпляр регистратора будет создан и связан с корневым LoggerConfig . Корневой LoggerConfig будет использоваться, когда нет файла конфигурации или когда вы получаете регистратор с именем, не определенным в объявлениях регистратора.
  • Объекты LoggerConfig создаются на основе объявления регистратора в файле конфигурации. LoggerConfig также используется для обработки Регистрации событий и делегирования их определенным Добавлениям Log4j2 .
  • Корневой регистратор является исключительным случаем с точки зрения его существования. Он всегда существует и находится на вершине любой иерархии регистраторов.
  • Вы можете получить корневой регистратор, используя приведенные ниже инструкции:
  • Имена регистраторов log4j2 чувствительны к регистру.
  • За исключением корневого регистратора, все регистраторы могут быть получены путем передачи их имени в LogManager.getLogger() .
  • LoggerContext-это голосовая точка для системы ведения журнала, поскольку в вашем приложении может быть несколько Loggercontext. Для каждого логгерконтекста должна быть установлена активная конфигурация.
  • Конфигурация Log4j2 содержит все ресурсы системы ведения журнала; LoggerConfig(ы), Приложение(ы), Фильтр(ы) и многие другие.
  • Вызов LogManager.getLogger() с использованием одного и того же имени всегда возвращает ссылку на один и тот же экземпляр регистратора.
  • Настройка системы ведения журнала обычно выполняется с помощью инициализации приложения. Это может принимать различные формы; программно или путем чтения файла конфигурации log4j2.

Каждый регистратор связан с объектом LoggerConfig, набор объектов LoggerConfig составляет Иерархию регистраторов. Эта концепция известна как Иерархия регистраторов .

Иерархия регистратора состоит из набора объектов LoggerConfig с отношениями “родитель-потомок”. Самым верхним элементом в Иерархии каждого Регистратора является Корневой регистратор.

Если Log4j2 не найдет файл конфигурации, для ведения журнала с уровнем ведения журнала как ОШИБКА будет использоваться только корневой регистратор. На рисунке ниже показано предупреждающее сообщение, которое вы получите в этом случае.

Регистратор состояния ошибок Не найден файл конфигурации log4j2. Использование конфигурации по умолчанию: запись только ошибок в консоль.

В таблице ниже показаны отношения “родитель-потомок” в иерархии регистратора.

Ребенок X потомок Корень потомок
X Родитель Ребенок ком потомок
Родитель Предок X ком Ребенок
Предок Предок Родитель ком X

Чтобы прояснить отношения между родителями и детьми, приведенную выше таблицу следует читать следующим образом:

  • Root является родителем для com.
  • Корень является предком для com.journaldev.
  • Корень является предком для com.journaldev.logging.
  • com является дочерним для Root.
  • com является родительским для com.journaldev.
  • com является предком com.journaldev.logging.
  • com.journaldev.logging является дочерним для com.journaldev и так далее.

Экземпляр LoggerConfig считается предком другого LoggerConfig; если его имя, за которым следует точка, является префиксом для имени потомка.

Экземпляр LoggerConfig считается родительским для другого LoggerConfig; если между ними обоими нет чередующихся имен.

Конфигурация Log4j2

Существует множество способов использования конфигурации Log4j2 в вашем приложении.

  1. Используя файл конфигурации, написанный в XML, JSON, YAML или файле свойств.
  2. Программно, путем создания фабрики конфигурации и реализации конфигурации.
  3. Программно, вызывая API, доступные в интерфейсе конфигурации.
  4. Программно, вызывая методы внутреннего класса регистратора.

Мы сосредоточимся в основном на файле конфигурации. Однако полезно также знать подход к программированию, если вы хотите настроить определенную стратегию ведения журнала для какого-либо конкретного регистратора.

Прежде всего, давайте рассмотрим случай, когда вы не предоставили файл конфигурации. Реализация Log4j2 предполагает, что существует системная переменная с именем Файл конфигурации log4j. , указывающая местоположение файла конфигурации log4j2.

package com.journaldev;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App
{
    public static void main( String[] args ) {
    	Logger logger = LogManager.getRootLogger();
    	logger.trace("Configuration File Defined To Be :: "+System.getProperty("log4j.configurationFile"));
    }
}

Простой файл конфигурации log4j2 будет выглядеть следующим образом.

configuration.xml:



  
    
      
    
  
  
    
      
    
  

А вот подробное объяснение кода, перечисленного выше:

  • Приложение ссылается на корневой регистратор, вызвав метод LogManager getRootLogger .
  • Обращение к регистратору из LogManager запустило систему Log4j.
  • Log4j проверит системное свойство файла конфигурации log4j., чтобы определить файл конфигурации log4j2. Конфигурация Log4j может быть записана в формате JSON, YAML и XML.
  • Мы можем задать системное свойство log4j.configurationFile с помощью System.setproperty("Файл конфигурации log4j","ПУТЬ к файлу") или передав его в качестве параметра JVM, как показано на рисунке ниже. Обратите внимание также на префикс протокола файла.
  • В случае, если системное свойство не определено порядок конфигурации имеет приоритет ниже:

    • Свойство ConfigurationFactory будет искать log4j2-test.properties в пути к классу.
    • Фабрика конфигурации YAML будет искать log4j2-тест.yaml или log4j2-test.yml в пути к классу.
    • JSONConfigurationFactory будет искать log4j2-test.jsn или log4j2-test.json в пути к классу.
    • XMLConfigurationFactory будет искать log4j2-test.xml в пути к классу.
    • Свойство ConfigurationFactory будет искать log4j2.properties в пути к классу
    • Фабрика конфигурации YAML будет искать log4j2.yml или log4j2.yaml в пути к классу.
    • JSONConfigurationFactory будет искать log4j2.jsn или log4j2.json в пути к классу.
    • XMLConfigurationFactory будет искать log4j2.xml в пути к классу.
    • Если файл конфигурации не был предоставлен, выполняется Конфигурация по умолчанию , и это приведет вас к набору поведений по умолчанию:

      • Будет использоваться корневой регистратор.
      • Уровень корневого регистратора будет установлен на ОШИБКА .
      • Корневой регистратор будет распространять сообщения журнала в консоль.
      • Для отображения шаблона задано значение %d{HH:mm:ss.SSS} [%t] %-5 уровень %регистратор{36} - %msg%n

Использование файла конфигурации log4j2 делает конфигурацию log4j2 такой простой, но давайте посмотрим, как мы можем настроить ее программно. Все дело в использовании ConfigurationFactory.

package com.journaldev;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory;
import org.apache.logging.log4j.core.layout.PatternLayout;
public class App
{
    public static void main( String[] args ) throws FileNotFoundException, IOException {
 
    	// Get instance of configuration factory; your options are default ConfigurationFactory, XMLConfigurationFactory,
    	// 	YamlConfigurationFactory & JsonConfigurationFactory
    	ConfigurationFactory factory =  XmlConfigurationFactory.getInstance();
 
    	// Locate the source of this configuration, this located file is dummy file contains just an empty configuration Tag
    	ConfigurationSource configurationSource = new ConfigurationSource(new FileInputStream(new File("C:/dummyConfiguration.xml")));
 
    	// Get a reference from configuration
    	Configuration configuration = factory.getConfiguration(configurationSource);
 
    	// Create default console appender
    	ConsoleAppender appender = ConsoleAppender.createDefaultAppenderForLayout(PatternLayout.createDefaultLayout());
 
    	// Add console appender into configuration
    	configuration.addAppender(appender);
 
    	// Create loggerConfig
    	LoggerConfig loggerConfig = new LoggerConfig("com",Level.FATAL,false);
 
    	// Add appender
    	loggerConfig.addAppender(appender,null,null);
 
    	// Add logger and associate it with loggerConfig instance
    	configuration.addLogger("com", loggerConfig);
 
    	// Get context instance
    	LoggerContext context = new LoggerContext("JournalDevLoggerContext");
 
    	// Start logging system
    	context.start(configuration);
 
    	// Get a reference for logger
    	Logger logger = context.getLogger("com");
 
    	// LogEvent of DEBUG message
    	logger.log(Level.FATAL, "Logger Name :: "+logger.getName()+" :: Passed Message ::");
 
    	// LogEvent of Error message for Logger configured as FATAL
    	logger.log(Level.ERROR, "Logger Name :: "+logger.getName()+" :: Not Passed Message ::");
 
    	// LogEvent of ERROR message that would be handled by Root
    	logger.getParent().log(Level.ERROR, "Root Logger :: Passed Message As Root Is Configured For ERROR Level messages");
    }
}
  • Вы можете использовать любой из конфигурационных файлов, предоставленных Log4j2, или использовать тот, который используется по умолчанию. Мы использовали XMLConfigurationFactory для получения экземпляра фабрики конфигурации.
  • Фабрика предоставит вам экземпляр необходимой ссылки на конфигурацию, передав соответствующий файл конфигурации.
  • Экземпляр конфигурации будет использоваться совместно с LoggerContext для запуска системы ведения журнала.
  • Приложение консоли настроено и добавлено в экземпляр конфигурации с макетом по умолчанию. Это приложение будет выводить сообщения на вашу консоль.
  • Экземпляр LoggerConfig был создан с указанным именем, УРОВНЕМ и без использования фильтра. Созданное приложение будет назначено для этого экземпляра LoggerConfig.
  • Экземпляр LoggerConfig добавлен в экземпляр конфигурации.
  • Создается новый экземпляр LoggerContext с определенным именем.
  • Экземпляр конфигурации был передан для экземпляра LoggerContext и вызван при запуске последнего.
  • Экземпляр регистратора был получен из LoggerContext. Этот экземпляр регистратора будет использоваться для запуска набора событий журнала.
  • Экземпляр регистратора запустил три события, которые будут описаны в разделе Уровни Log4j2.
  • регистратор com настроен на распечатку сообщений, уровни которых являются ФАТАЛЬНЫМИ.
  • По умолчанию Корневой регистратор настроен для печати сообщений, уровень которых является ОШИБКОЙ.
  • Сообщения об ошибках не будут регистрироваться регистратором “com”, потому что его уровень является ФАТАЛЬНЫМ.

Ту же конфигурацию можно выполнить с помощью YAML, JSON или файла свойств. Однако конфигурация файла свойств log4j2 отличается от файла свойств log4j, поэтому убедитесь, что вы не пытаетесь использовать конфигурацию файла свойств log4j с log4j2. Это приведет к ошибке ниже;

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

При обработке приведенного выше кода вы получите следующий вывод:

Logger Name :: com :: Passed Message ::
00:01:27.705 [main] ERROR - Root Logger:: Passed Message As Root Is Configured For ERROR Level messages

Первая строка журналов взята из com регистратора, а вторая – из Корневого регистратора. сообщение об ошибке регистратора com не печатается, так как его уровень является фатальным.

Уровни Log4j2 Вы можете видеть в приведенных выше примерах кода, что каждый раз, когда мы определяем LoggerConfig, мы также предоставляем уровень ведения журнала. По умолчанию ведение журнала log4j2 является аддитивным. Это означает, что все родительские регистраторы также будут использоваться при использовании определенного регистратора. Приведенное ниже изображение проясняет эту ситуацию.И здесь следует пояснить:как мы уже говорили ранее, каждый регистратор связан с экземпляром LoggerConfig. Этот параметр LoggerConfig был определен в области конфигурации.Уровень ведения журнала можно определить в области LoggerConfig.Вы можете получить регистратор по его имени, родительскому пакету или указав сам корневой регистратор.Корневой регистратор-это узел верхнего уровня для каждой иерархии LoggerConfig.Как только вы получите регистратор com.journaldev и инициируете событие входа для ведения журнала, LoggerConfig (net.journaldev) зарегистрирует сообщение, и сообщение также будет распространяться вверх по иерархии без какого-либо уважения к уровням ведения журнала родителей. Таким образом, событие журнала будет распространено среди регистраторов come и Root, и они