Logback и Log4j2 — одни из самых известных фреймворков ведения журналов в JAVA. Платформа Logback используется только вместе с библиотекой SLF4J, которая представляет собой интерфейс для систем регистрации событий.
Log4j2 — это вторая, улучшенная версия средства ведения журнала Log4, библиотеки ведения журналов, которая разделяет API и реализацию, позволяя использовать API Log4j 2 в сочетании с реализацией другого средства ведения журнала.
Spring Music — это приложение для использования службы базы данных платформы Cloud Foundry в сочетании с Spring Framework и Spring Boot. Он предназначен для хранения одних и тех же объектов домена в одном из множества различных хранилищ — объектно-реляционном, документно-ориентированном или распределенном (хранилище «ключ-значение»).
Два наиболее распространенных средства ведения журнала, используемые вместе с Spring/Spring Boot, — это Logback и Log4j2. До недавнего времени разработчик имел большую свободу действий относительно формата логов и самих файлов, используемых для логирования.
Однако в современном мире внедрения и масштабирования контейнеров ведение журналов обычно предлагает корпоративные решения, требующие определенного уровня стандартизации.
Одна из самых больших проблем заключается в том, что исключения Java обычно приводят к большой многострочной трассировке стека в журналах.
Из-за этого вместо одного события журнала, указывающего на исключение или сообщение об ошибке, вы получаете более 100 различных журналов, по одному на каждую строку трассировки стека, перемежающихся другими событиями журнала, поступающими от других служб или экземпляров служб.
В этой статье объясняется, как настроить приложение Spring Boot для свертывания исключений в одну строку как для средства ведения журнала Logback, так и для средства ведения журнала Log4j2. Это позволяет рассматривать журнал исключений и трассировку стека как один журнал событий.
Классы ошибок и исключений в JAVA
Установленные и снятые отметки Непроверенные исключения Исключение в JAVA
Приложение «Весенняя музыка»
В этой статье используется специальная версия приложения для специализированного ведения журналов.весенняя музыка , необходимый для работы логгеров Logback и Log4j2. Сначала нам нужно убедиться, что мы можем воссоздать его из источника.
Для проекта требуется Java8, поэтому первым шагом будет установка Java8 на ваш хост Ubuntu.
Затем берем исходный код проекта из github и создадим сборку с помощью встроенных скриптов системы сборки Gradle:
Свертывание многострочных исключений с помощью Logback
Давайте двинемся дальше и создадим архив проекта Java jar с реализацией логгера Logback с помощью стандартной команды Gradle:Файл build/libs/spring-music.jar является самоисполняющимся и содержит встроенный Tomcat, привязанный к localhost:8080. Файл jar вызывается с помощью команды:
Вызов http://localhost:8080 Браузер покажет вам страницу со списком Альбомов, а в консоли отобразится строка журнала, имеющая такой вид:
Этот синтаксис строки журнала определен в « src/main/resources/logback-spring.xml » с использованием пользовательского шаблона:
Переменные ${.
} извлекаются из свойств application.properties и системных свойств, которые можно просмотреть на странице по адресу http://localhost:8080/env .
Однако нужная нам часть кода находится сразу после сообщения (%m).
Слово «MULTIEXCEPTION» не имеет какого-либо специального значения, это просто уникальный строковый маркер, который позволяет нам узнать, где заканчивается сообщение (%m) и начинается исключение.
Если хотите, можете оставить этот маркер.
Далее, вместо того, чтобы просто вставлять заполнитель %xException, который выводит большую трассировку стека с символами новой строки, мы преобразуем значение с помощью функции %replace и заменяем все символы новой строки выражением «\u2028», что Представление разделителя строк в Юникоде .
Удаление символов «\n» из трассировки стека означает, что трассировка стека теперь будет отправляться в виде одной строки.
Чтобы доказать это, перейдите по ссылке http://localhost:8080/errors/throw , где доступно Контроллер ошибок который намеренно генерирует исключение NullPointerException со следующим кодом:
В результате в консоли появится строка журнала, показанная ниже:
Здесь вы можете видеть, что выражение «u2028» отделяет то, что раньше было новой строкой в трассировке стека.
Теперь сообщение об исключении и трассировка стека будут отправляться как одно целое.
Свертывание многострочных исключений с помощью Log4j2
Чтобы переопределить сценарий сборки по умолчанию и использовать Log4j2 в качестве резервной реализации для данного проекта, вам необходимо использовать файл «build-log4j2.gradle».
Файл build/libs/spring-music.jar является самоисполняющимся и использует встроенный Tomcat, привязанный к localhost:8080. Как и в предыдущем примере, jar-файл вызывается с помощью команды:
Вызов http://localhost:8080 при использовании браузера отобразится страница со списком альбомов с выводом строки журнала на консоль, которая выглядит следующим образом:
Этот синтаксис строки журнала определен в « источник/основной/ресурсы/log4j2.xml » с использованием пользовательского шаблона:
Переменные ${.
} извлекаются из свойств application.properties и системных свойств, которые можно просмотреть на странице по адресу http://localhost:8080/env .
Однако нужная нам часть кода находится сразу после сообщения (%m).
Слово «MULTIEXCEPTION» не имеет особого значения, это просто выбранный нами уникальный строковый маркер, который позволяет нам узнать, где заканчивается сообщение (%m) и начинается исключение.
Если хочешь, можешь оставить это.
Но затем, вместо того, чтобы просто вставлять заполнитель %xException, который выводит большую трассировку стека с символами новой строки, мы преобразуем значение с помощью функции %replace, которая заменяет все символы новой строки выражением «\u2028», которое является Представление разделителя строк в Юникоде .
Удаление символов «\n» из трассировки стека означает, что трассировка стека теперь будет отправляться в виде одной строки.
Чтобы доказать это, перейдите по ссылке http://localhost:8080/errors/throw , где доступно Контроллер ошибок который намеренно генерирует исключение NullPointerException со следующим кодом:
В результате в консоли появится строка журнала, показанная ниже:
Как видите, здесь выражение «u2028» отделяет то, что раньше было новой строкой в трассировке стека.
Теперь сообщение об исключении и трассировка стека будут отправляться как одно целое.
выводы
Возможность свернуть многострочную трассировку стека Java в одну строку означает, что этот метод можно рассматривать как единое централизованное решение для журналирования.Нет смысла тратить вычислительные и человеческие ресурсы на реконструкцию трассировки стека на стороне назначения с использованием идентификаторов корреляции, больших размеров стека, высокой загрузки ЦП и интеллектуального анализа, когда гораздо эффективнее выполнить такое сокращение на стороне источника.
В этом случае символ Юникода всегда можно заменить на стороне сбора журналов (например, на стороне конвейера сбора журналов, фильтрации и нормализации Logstash), чтобы восстановить сообщение в исходном формате.
Справочный материал
- https://docs.cloudfoundry.org/loggregator/architecture.html#metron (Архитектура журналирования CF) docs.pivotal.io/pivotalcf/2-0/devguide/deploy-apps/streaming-logs.html#format (типы журналов потоков)
- https://docs.pivotal.io/tiledev/2-0/nozzle.html#examples (формат журнала для компонентов CF =<${PRI}> ${VERSION} ${TIMESTAMP} ${HOST_IP} ${APP_NAME} ${PROD_ID} ${MSG_ID} ${SD-ELEMENT-instance} ${MESSAGE})
- http://grokconstructor.appspot.com/do/construction (онлайн-версия шаблонов Grok)
- https://github.com/cloudfoundry/dropsonde-protocol (Протокол Cloud Foundry Dropsonde для сериализации структурированных данных)
- https://logback.qos.ch/manual/layouts.html (форматы компонентов для преобразования входящего сообщения в строку)
- https://www.elastic.co/guide/en/logstash/current/plugins-codecs-protobuf.html (вход logstash protobuf)
- https://github.com/cloudfoundry-community/firehose-to-syslog (отправка событий пожарного шланга из Cloud Foundry в системный журнал)
- http://schd.ws/hosted_files/cfsummit2016/f7/MonitoringCloudFoundry-LearningAboutTheFirehose.pdf (отображение частей UDP и TCP системы журналирования CF)
- https://github.com/cloudfoundry-community/logsearch-for-cloudfoundry (стек ELK для CF)
- https://discuss.pivotal.io/hc/en-us/articles/223207207-Why-Loggregator-may-lose-logs (прогноз потерь сообщений/сек)
- http://scottfrederick.cfapps.io/blog/2014/02/20/cloud-foundry-and-logstash (как разделить событие системного журнала 5424)
- https://logz.io/blog/cloud-foundry-elk-stack/ (разделение системного журнала 5424, встроенный сервис, такой как платформа визуализации и анализа данных Kibana)
- https://docs.cloudfoundry.org/loggregator/cli-plugin.html (Плагин CF CLI для просмотра firehost)
- https://github.com/cloudfoundry/loggregator-release/blob/develop/docs/java-multi-line-work-around.md (обход журнала для многострочного исключения)
- https://stackoverflow.com/questions/23096129/make-logback-include-the-t-between-date-and-time-in-its-date-format-for-str (формат даты и времени журнала)
- http://cloud.rohitkelapure.com/2016/06/multi-line-java-stack-traces-out-of.html (формат строки журнала для краха исключения)
- https://discuss.elastic.co/t/match-and-replace-unicode-characters/56656 (идея использования Ruby для замены Unicode в тех случаях, когда Mutate не работает)
- https://www.diycode.cc/projects/cloudfoundry/loggregator (ведение журнала и манифест BOSH)
- https://www.elastic.co/guide/en/logstash/5.0/breaking-changes.html (критическое изменение в event.get() для Ruby)
- https://medium.com/@martatatiana/aws-lambda-in-java-8-log4j2-and-scattered-stacktrace-in-cloudwatch-a4aea2e7bf2a (LogEventPatternConverter — пользовательский конвертер журналов log4j2)
- https://springframework.guru/using-log4j-2-spring-boot/ (используя log4j2 в Spring Boot)
- https://www.quickprogrammingtips.com/spring-boot/using-log4j2-with-spring-boot.html (совместное использование log4j2 и Spring Boot)
- https://logging.apache.org/log4j/2.x/manual/layouts.html (шаблоны log4j2)
- http://www.codepreference.com/2016/04/configurable-thread-context-tags-log4j2.html (переменная контекста ведения журнала потока)
- https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html (внешние настройки конфигурации Spring Boot)
- http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution (замена свойств log4j2)
Немного рекламы :)
Спасибо, что остаетесь с нами.Вам нравятся наши статьи? Хотите увидеть больше интересных материалов? Поддержите нас, разместив заказ или порекомендовав друзьям, облачный VPS для разработчиков от $4,99 , уникальный аналог серверов начального уровня, который мы придумали для вас: Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от 19$ или как правильно раздать сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40 ГБ DDR4).
Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только здесь 2 x Intel TetraDeca-Core Xeon, 2 x E5-2697v3, 2,6 ГГц, 14C, 64 ГБ DDR4, 4 твердотельных накопителя по 960 ГБ, 1 Гбит/с, 100 ТВ от 199 долларов США в Нидерландах! Dell R420 — 2x E5-2430, 2,2 ГГц, 6C, 128 ГБ DDR3, 2 твердотельных накопителя по 960 ГБ, 1 Гбит/с, 100 ТБ — от 99 долларов США! Прочтите об этом Как построить корпоративную инфраструктуру класса, используя серверы Dell R730xd E5-2650 v4 стоимостью 9000 евро за копейки? Теги: #github #программирование #java #log4j2 #Logback #Spring Music
-
Ноутбук – Зачем Вообще Его Покупать?
19 Oct, 24 -
Математика Для Тестировщиков
19 Oct, 24