Log4j 2 – це оновлена покращена версія популярної java бібліотеки для логування log4j.
В цій нотатці буде розглянуто:
- підключення log4j 2 в maven проект
- конфігурація логування за допомогою xml файлу
- створення об’єкту Logger та вивід логів в консоль
- рівні логування
Підключення log4j 2 в maven проект
Для початку роботи з log4j 2, в maven проекті потрібно додати дві залежності до pom.xml файлу проекту:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.21.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.21.0</version>
</dependency>Конфігурація логування за допомогою xml файлу
Зазвичай log4j 2 налаштовується через файл properties або xml. В своєму прикладі я буду використовувати xml. Для цього створюю файл log4j2.xml та кладу його по шляху src/main/resources:

Вміст файлу log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %c{1}.%M [%L] %-5level - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>На що слід звернути увагу:
- секція Appenders відповідає за доставку LogEvent (повідомлень) до місця призначення. Для виводу повідомлень в консоль, я визначив один Appender типу Console
- PatternLayout визначає шаблон для повідомлення. В моєму прикладі це:
- %d час події
- %t потік в якому сталася подія
- %с клас та %M метод
- %L рядок
- а також рівень, повідомлення додане до події та символ переносу на новий рядок для послідуючого LogEvent
- в секції Loggers налаштовуються реєстратори подій. В моєму прикладі визначено лише кореневий реєстратор з рівнем логування INFO
- AppenderRef вказує куди будуть надсилатися повідомлення. Тут я посилаюся на вищє налаштований консольний Appender з ім’ям Console
Cтворення об’єкту Logger та вивід логів в консоль
Для прикладу створюю клас Log4j2Example. Код класу:
package wiki.it.notes.log4j2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Example {
private static final Logger logger = LogManager.getLogger(Log4j2Example.class);
public static void main(String[] args) {
logger.info("Message for INFO level");
logger.error("Message for ERROR level");
}
}- об’єкт Logger отримую за допомогою виклику LogManager.getLogger
- за допомогою об’єкту Logger та його методів info, error роблю записи повідомлень логування
Результат виконання програми:
10:12:15.279 [main] Log4j2Example.main [11] INFO - Message for INFO level
10:12:15.280 [main] Log4j2Example.main [12] ERROR - Message for ERROR levelРівні логування
Для можливості ідентифікації та групування LogEvents, в залежності від їх severity, log4j 2 має інструмент рівнів логування. Якщо відобразити їх в порядку пріоритетності:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFFВ моєму прикладі в Root логері встановлено рівень INFO – це означає, що будуть відображатись лише повідомлення рівнів INFO, WARN, ERROR, FATAL. Повідомлення рівнів DEBUG та TRACE будуть проігноровані.
Наприклад додам до своєї програми ще один рядок, з викликом методу logger.debug:
public static void main(String[] args) {
logger.info("Message for INFO level");
logger.error("Message for ERROR level");
logger.debug("Message for DEBUG level");
}Результат виконання програми залишається незмінним:
14:25:42.940 [main] Log4j2Example.main [11] INFO - Message for INFO level
14:25:42.943 [main] Log4j2Example.main [12] ERROR - Message for ERROR levelРядок з викликом logger.debug не додав повідомлення до логів програми.
Приклад з нотатки на сторінці Github:
Log4j 2 simple configuration example
Документація бібліотеки: