Автор оригинала: Pankaj Kumar.
Добро пожаловать в учебник по примерам Apache Log4j2. Если вы спросите опытного разработчика о самой раздражающей вещи в приложении, ответ может быть связан с ведением журнала. Если в приложении нет подходящего входа в систему, обслуживание будет кошмаром.
Большая часть приложений проходит тестирование на разработку, модульное тестирование, интеграционное тестирование. Но когда дело доходит до производства, вы всегда будете сталкиваться с уникальными сценариями и исключениями. Таким образом, единственный способ выяснить, что произошло в конкретном случае, – это выполнить отладку с помощью журналов.
Многие платформы предоставляют какой-либо способ ведения журнала по умолчанию, но всегда лучше использовать стандартный отраслевой механизм ведения журнала. Apache Log4j-одна из наиболее широко используемых систем ведения журнала. Apache Log4j 2-это следующая версия, которая намного лучше, чем Log4j.
Пример учебника Log4j
В этом примере урока Log4j2 вы узнаете, как начать работу с Apache Log4j2 . Мы также рассмотрим архитектуру Log4j2, конфигурацию log4j2, уровни ведения журнала log4j2, приложения, фильтры и многое другое.
- Обзор Log4j2
- Архитектура Log4j2
- Конфигурация Log4j2
- Уровни Log4j2
- Поиск в журнале 4j2
- Приложения Log4j2
- Фильтры Log4j2
- Макеты Log4j2
- Какой уровень Log4j2 вы должны использовать
- Краткое описание учебного пособия Log4j2
Обзор Log4j2
Использование API ведения журнала в приложении-это не роскошь, это необходимо иметь. Log4j – это библиотека с открытым исходным кодом, которая опубликована и лицензирована под Программным обеспечением Apache .
Вы можете отлаживать приложение с помощью отладки Eclipse или некоторых других инструментов, но этого недостаточно и невозможно в рабочей среде.
Механизм ведения журнала предоставит вам несколько преимуществ, которых вы не найдете при обычной отладке.
Нет необходимости в человеческом вмешательстве | Существует необходимость в человеческом вмешательстве | Вмешательство человека |
Может быть интегрирован с постоянным хранилищем (файлы, база данных, база данных NoSQL и т.д.) | Не может быть интегрирован с постоянным хранилищем | Стойкая Среда |
Может быть использован для достижения аудита, если он используется эффективно | Не может быть использован для достижения аудита | Может использоваться для аудита |
Достаточный | Недостаточно; вы можете заблудиться в потоке. | Достаточно для сложной структуры и потока |
Более продуктивно | Менее продуктивно | Производительность |
Как вы можете видеть выше, использование механизма ведения журнала будет более эффективным при меньших затратах на техническое обслуживание.
Apache Log4j-это передовой инструмент для входа в Java-приложения, поэтому вам следует его использовать.
Архитектура Log4j2
Прежде чем мы перейдем к учебнику по примеру Log4j, полезно изучить архитектуру Log4j2. На рисунке ниже показаны важные классы в API Log4j2.
Вот подробное объяснение архитектуры, показанной выше:
- Приложения будут запрашивать
LogManager
дляРегистратора
с определенным именем. LogManager
найдет соответствующийLoggerContext
и затем получитLogger
из него.Если регистратор еще не создан, он будет создан и связан с LoggerConfig в соответствии с тремя вариантами ниже:
- Экземпляр регистратора будет создан и связан с LoggerConfig , имеющим то же имя. Например App.class в
getLogger(App.class)
будет оцениваться как строкаcom.journaldev.Приложение
. Имя LoggerConfig идентично полному имени класса (программный компонент). - Экземпляр регистратора будет создан и связан с LoggerConfig , имеющим тот же родительский пакет регистраторов. Например
com.journaldev
вgetLogger("com.journaldev")
- Экземпляр регистратора будет создан и связан с корневым LoggerConfig . Корневой LoggerConfig будет использоваться, когда нет файла конфигурации или когда вы получаете регистратор с именем, не определенным в объявлениях регистратора.
- Экземпляр регистратора будет создан и связан с LoggerConfig , имеющим то же имя. Например App.class в
Объекты 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 в вашем приложении.
- Используя файл конфигурации, написанный в XML, JSON, YAML или файле свойств.
- Программно, путем создания фабрики конфигурации и реализации конфигурации.
- Программно, вызывая API, доступные в интерфейсе конфигурации.
- Программно, вызывая методы внутреннего класса регистратора.
Мы сосредоточимся в основном на файле конфигурации. Однако полезно также знать подход к программированию, если вы хотите настроить определенную стратегию ведения журнала для какого-либо конкретного регистратора.
Прежде всего, давайте рассмотрим случай, когда вы не предоставили файл конфигурации. Реализация 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
- Свойство ConfigurationFactory будет искать
Использование файла конфигурации 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 не печатается, так как его уровень является фатальным.