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

Документація бібліотеки:

Apache Log4j™ 2


Мітки: