Вопрос или проблема
С помощью 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:
-
Зависимости: Убедитесь, что в вашем проекте подключены нужные зависимости 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>
-
Конфигурация 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>
-
Логирование с атрибутами: Теперь вы можете использовать логгер для создания структурированных сообщений. Например:
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); } }
- Отправка в Azure Monitor: Если вы используете Azure Monitor, убедитесь, что у вас установлен соответствующий аппендер или экспортер. В Log4j можно создать кастомный аппендер, который будет отправлять логи в Azure, включая структурированные данные.
Таким образом, логирование с помощью Log4j может быть легко адаптировано для отправки необходимых структурированных данных, однако потребуется настройка форматов и создание специальных аппендеров для правильной интеграции с Azure.