Как передать структурированные поля логов с помощью log4j?

Вопрос или проблема

С помощью slf4j я могу сделать следующее:

logger.atInfo().setMessage("Мое сообщение").addKeyValue("foo", "bar").addKeyValue("code", 42).log()

При использовании с Azure Monitor OpenTelemetry Exporter и Appender для Logback это создает записи в traces таблицах App Insight, как показано ниже:

дополнительные атрибуты, которые я передал

Как добиться такого же результата с использованием интерфейса логирования log4j? Я не смог найти перегрузку метода, принимающую дополнительные атрибуты.

Ответ или решение

Чтобы отправить структурированные логированные поля с помощью Log4j, вам потребуется использовать библиотеку Log4j 2, которая поддерживает подобные возможности. В отличие от SLF4J, Log4j 2 напрямую не предоставляет методов для добавления пользовательских атрибутов в логи через простые вызовы методов. Тем не менее, вы можете достичь желаемого результата с помощью пресетов и JSON форматов.

Вот пример того, как можно реализовать структурированное логирование в Log4j 2:

  1. Зависимости: Убедитесь, что в вашем проекте подключены нужные зависимости Log4j 2. Например, в файле pom.xml для Maven это может выглядеть так:

    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>2.x.x</version> <!-- Замените на актуальную версию -->
    </dependency>
    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>2.x.x</version> <!-- Замените на актуальную версию -->
    </dependency>
    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-slf4j-impl</artifactId>
       <version>2.x.x</version> <!-- Замените на актуальную версию -->
    </dependency>
  2. Конфигурация Log4j: Создайте файл конфигурации log4j2.xml, где вы сможете настроить JSON-форматирование. Пример:

    <Configuration>
       <Appenders>
           <Console name="Console" target="SYSTEM_OUT">
               <JsonLayout complete="true" compact="false">
                   <KeyValuePair key="appName" value="MyApplication"/>
                   <KeyValuePair key="environment" value="production"/>
               </JsonLayout>
           </Console>
       </Appenders>
       <Loggers>
           <Root level="info">
               <AppenderRef ref="Console"/>
           </Root>
       </Loggers>
    </Configuration>
  3. Логирование с атрибутами: Теперь вы можете использовать логгер для создания структурированных сообщений. Например:

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.Marker;
    import org.apache.logging.log4j.MarkerManager;
    
    public class MyClass {
       private static final Logger logger = LogManager.getLogger(MyClass.class);
    
       public void logMessage() {
           Marker customMarker = MarkerManager.getMarker("CUSTOM_MARKER");
           logger.info(customMarker, "My message - foo: {}, code: {}", "bar", 42);
       }
    }
  4. Отправка в Azure Monitor: Если вы используете Azure Monitor, убедитесь, что у вас установлен соответствующий аппендер или экспортер. В Log4j можно создать кастомный аппендер, который будет отправлять логи в Azure, включая структурированные данные.

Таким образом, логирование с помощью Log4j может быть легко адаптировано для отправки необходимых структурированных данных, однако потребуется настройка форматов и создание специальных аппендеров для правильной интеграции с Azure.

Оцените материал
Добавить комментарий

Капча загружается...