Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2

в 11:41, , рубрики: github, java, log4j2, logback, Spring Music, Блог компании ua-hosting.company, Программирование

Logback и Log4j2 – одни из самых известных фреймворков логирования в JAVA. Фреймворк Logback используется только совместно с библиотекой SLF4J, которая представляет собой интерфейс для систем протоколирования событий. Log4j2 представляет собой вторую, улучшенную версию логгера Log4, библиотеку логирования, в которой интерфейс API и реализация выделены отдельно, что позволяет использовать API Log4j 2 совместно с реализацией другого логгера.

Spring Music является приложением для использования сервиса базы данных среды Cloud Foundry совместно со Spring Framework и Spring Boot. Оно создано для сохранения одних и тех же доменных объектов в одном из множества различных хранилищ – объектно-реляционном, документно-ориентированном или распределенном (key-value store).

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 1

Двумя наиболее распространенными логгерами, которые используются совместно со Spring / Spring Boot, являются Logback и Log4j2. Еще недавно разработчик имел большую свободу действий в отношении формата логов и самих файлов, используемых для ведения журнала. Однако в современном мире внедрения контейнеров и масштабирования логирование обычно предлагает корпоративные решения, требующие определенного уровня стандартизации.

Одна из самых больших проблем заключается в том, что исключения Java обычно приводят к большой многострочной трассировке стека в журналах. Из-за этого вместо одного события журнала, указывающего на исключение, или сообщение об ошибке, у вас возникает более 100 различных логов, по одному на каждую строку трассировки стека, перемежающихся другими событиями журнала, поступающими от других служб или экземпляров служб.

В этой статье рассказывается, как настроить приложение Spring Boot для свертывания исключений в одну строку как для логгера Logback, так и для Log4j2. Это позволяет рассматривать логирование исключения и трассировку стека как один лог событий.

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 2
Классы ошибок Error и исключений Exception в JAVA

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 3
Проверяемые Checked и непроверяемые Unchecked исключения Exception в JAVA

Приложение Spring Music

В этой статье для специализированного логирования используется кастомная версия приложения spring-music,  необходимая для работы логгеров Logback и Log4j2. Для начала нужно убедиться, что мы сможем воссоздать ее из источника. Проект требует наличия Java8, поэтому первым шагом является установка Java8 на ваш хост Ubuntu.

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 4

Затем мы берем исходный код проекта с github и создаем сборку с использованием встроенных скриптов системы сборки Gradle:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 5

Свертывание многострочных исключений с использованием Logback

Двинемся дальше и создадим Java-архив проекта jar с реализацией логгера Logback с помощью стандартной команды Gradle:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 6

Файл “build/libs/spring-music.jar” является самоисполняемым и содержит встроенный Tomcat, который привязан к localhost:8080. Вызов jar-файла осуществляется с помощью команды:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 7

Вызов http://localhost:8080 в браузере покажет вам страницу со списком Альбомов, а в консоль будет выведена строка лога, выглядящая таким образом:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 8

Этот синтаксис строки лога определен в “src/main/resources/logback-spring.xml” с использованием пользовательского шаблона:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 9

Переменные ${…} извлекаются из application.properties и system properties, которые можно просмотреть на странице по адресу http://localhost:8080/env. Однако нужная нам часть кода находится сразу после сообщения (%m).

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 10

Слово ‘MULTIEXCEPTION’ не имеет особого значения, это просто уникальный строковый маркер, который позволяет нам узнать, где заканчивается сообщение (%m) и начинается исключение. Если хотите, то можете оставить этот маркер.

Далее, вместо того, чтобы просто вставлять заполнитель %xException, который выводил бы большую трассировку стека с символами новой строки, мы преобразуем значение при помощи функции %replace и заменяем все символы новой строки на выражение “u2028”, которое является представлением разделителя строк Unicode.

Удаление символов "n" из трассировки стека означает, что теперь трассировка стека теперь будет отправляться в однострочном виде. Чтобы доказать это, перейдите по ссылке http://localhost:8080/errors/throw, где имеется Error Controller, который намеренно отбрасывает NullPointerException с помощью следующего кода:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 11

Это создает в консоли строку лога, показанную ниже:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 12

Здесь видно, что выражение «u2028» отделяет то, что раньше было переводом строки в трассировке стека. Теперь сообщение об исключении и трассировка стека будут отправлены как единое целое.

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 13

Свертывание многострочных исключений с использованием Log4j2

Чтобы переопределить сценарий сборки по умолчанию и использовать Log4j2 в качестве резервной реализации данного проекта, нужно использовать файл “build-log4j2.gradle”.

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 14

Файл “build/libs/spring-music.jar” является самоисполняемым и использует встроенный Tomcat, который привязан к localhost:8080. Как и в предыдущем примере, вызов jar-файла осуществляется с помощью команды:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 15

Вызов http://localhost:8080 с помощью браузера отобразит страницу со списком Альбомов с выводом на консоль строки лога, которая выглядит следующим образом:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 16

Этот синтаксис строки журнала определен в “src/main/resources/log4j2.xml” с использованием кастомного шаблона:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 17

Переменные ${…} извлекаются из application.properties и system properties, которые можно просмотреть на странице по адресу http://localhost:8080/env. Однако нужная нам часть кода находится сразу после сообщения (%m).

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 18

Слово ‘MULTIEXCEPTION’ не имеет специального значения, это просто уникальный строковый маркер по нашему выбору, который позволяет узнать, где заканчивается сообщение (%m) и начинается исключение. Если хотите, то можете его оставить.

Но после этого вместо того, чтобы просто вставлять заполнитель %xException, который выводил бы большую трассировку стека с символами новой строки, мы преобразуем значение при помощи функции %replace, которая заменяет все символы новой строки выражением “u2028”, которое является представлением разделителя строк Unicode.

Удаление символов "n" из трассировки стека означает, что теперь трассировка стека теперь будет отправляться в виде одной строки. Чтобы доказать это, перейдите по ссылке http://localhost:8080/errors/throw, где имеется Error Controller, который намеренно отбрасывает NullPointerException с помощью следующего кода:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 19

Это создает в консоли строку лога, показанную ниже:

Java: свертывание многострочных логов в однострочный лог с помощью Spirng и логгера Logback или Log4j2 - 20

Как можно увидеть, здесь выражение «u2028» отделяет то, что раньше было переводом строки в трассировке стека. Теперь сообщение об исключении и трассировка стека будут отправляться как единое целое.

Выводы

Возможность свертывания многострочной трассировки стека Java в одну строку означает, что данный прием можно рассматривать как единое централизованное решение логирования.
Не существует никаких причин тратить вычислительные и человеческие ресурсы на восстановление трассировки стека на стороне назначения с помощью идентификаторов корреляции, больших размеров стека, высокой загрузки процессора и «умного» парсинга, если гораздо эффективнее выполнить это свертывание на стороне источника.

При этом символ Unicode всегда может быть заменен на стороне сбора логов (например, на стороне конвейера для сбора, фильтрации и нормализации логов Logstash) для восстановления сообщения в исходном формате.

Ссылочный материал

Немного рекламы :)

Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Автор: ua-hosting.company

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js