Введение
Программное обеспечение для ведения журналов на основе Java, Apache Log4j – это утилита для ведения журналов, разработанная на Java, первоначально созданная Ceki Gülcü. Она является частью Apache Logging Services, проекта Apache Software Foundation. Log4j – один из нескольких фреймворков для ведения журналов Java. Gülcü впоследствии создал SLF4J, Reload4j и Logback, которые являются альтернативами Log4j. Команда Apache Log4j разработала Log4j 2 в ответ на проблемы Log4j 1.2, 1.3, java.util.logging и Logback, решая вопросы, возникавшие в этих фреймворках. Кроме того, Log4j 2 предлагает архитектуру плагинов, что делает его более расширяемым, чем его предшественник. Log4j 2 не обеспечивает обратную совместимость с версиями 1.x, хотя доступен "адаптер". 5 августа 2015 года Комитет по управлению проектом Apache Logging Services объявил, что Log4j 1 достиг конца жизненного цикла и рекомендовал пользователям Log4j 1 обновиться до Apache Log4j 2. 12 января 2022 года Ceki Gülcü выпустил форк и переименованную версию log4j 1.2 под названием Reload4j версии 1.2.18.0 с целью исправления наиболее критичных проблем в log4j 1.2.17, накопившихся с момента его выпуска в 2013 году. 9 декабря 2021 года команда безопасности Alibaba Cloud обнаружила уязвимость нулевого дня, позволяющую выполнять произвольный код в Log4j 2, и присвоила ей идентификатор "Log4Shell". Преимущества Log4j 2 перед Log4j 1:
Повышенная надежность. Сообщения не теряются при переконфигурации фреймворка, как это происходило в Log4j 1 или Logback.
Расширяемость: Log4j 2 поддерживает систему плагинов, позволяющую пользователям определять и настраивать собственные компоненты.
Упрощенный синтаксис конфигурации.
Поддержка конфигураций в форматах XML, JSON, YAML и properties.
Улучшенные фильтры.
Поддержка поиска свойств для значений, определенных в файле конфигурации, системных свойствах, переменных окружения, карте ThreadContext и данных, содержащихся в событии.
Поддержка нескольких API: Log4j 2 может использоваться с приложениями, использующими API Log4j 2, Log4j 1.2, SLF4J, Commons Logging и java.util.logging (JUL).
Настраиваемые уровни логирования.
Поддержка лямбда-выражений в стиле Java 8 для "ленивого логирования".
Маркеры.
Поддержка пользовательских объектов сообщений.
"Минимальное использование памяти или низкий уровень сборки мусора" в типовых конфигурациях.
Повышенная скорость работы.
Улучшенная поддержка Linux.
the Java logging framework
Apache Log4j is a Java based logging utility originally written by Ceki Gülcü. It is part of the Apache Logging Services, a project of the Apache Software Foundation. Log4j is one of several Java logging frameworks. Gülcü has since created SLF4J, Reload4j, and Logback which are alternatives to Log4j. The Apache Log4j team developed Log4j 2 in response to the problems of Log4j 1.2, 1.3, java. util. logging and Logback, addressing issues which appeared in those frameworks. In addition, Log4j 2 offered a plugin architecture which makes it more extensible than its predecessor. Log4j 2 is not backwards compatible with 1. x versions, although an "adapter" is available. On August 5, 2015, the Apache Logging Services Project Management Committee announced that Log4j 1 had reached end of life and that users of Log4j 1 were advised to upgrade to Apache Log4j 2. On January 12, 2022, a forked and renamed log4j version 1.2 was released by Ceki Gülcü as Reload4j version 1.2.18.0 with the aim of fixing the most urgent issues in log4j 1.2.17 that had accumulated since its release in 2013. On December 9, 2021, a zero day vulnerability involving arbitrary code execution in Log4j 2 was published by the Alibaba Cloud Security Team and given the descriptor "Log4Shell". from Log4j 1 are:
Improved reliability. Messages are not lost while reconfiguring the framework like in Log4j 1 or Logback
Extensibility: Log4j 2 supports a plugin system to let users define and configure custom components
Simplified configuration syntax
Support for xml, json, yaml and properties configurations
Improved filters
Property lookup support for values defined in the configuration file, system properties, environment variables, the ThreadContext Map, and data present in the event
Support for multiple APIs: Log4j 2 can be used with applications using the Log4j 2, Log4j 1.2, SLF4J, Commons Logging and java. util. logging (JUL) APIs. Custom log levels
Java 8 style lambda support for "lazy logging"
Markers
Support for user defined Message objects
"Garbage free or low garbage" in common configurations
Improved speed
Improved support for Linux
One of the most recognized features of Log4j 2 is the performance of the "Asynchronous Loggers". Log4j 2 makes use of the LMAX Disruptor. The library reduces the need for kernel locking and increases the logging performance by a factor of 12. For example, in the same environment Log4j 2 can write more than 18,000,000 messages per second, whereas other frameworks like Logback and Log4j 1 just write < 2,000,000 messages per second.
Одной из наиболее заметных особенностей Log4j 2 является производительность "Асинхронных логгеров". Log4j 2 использует библиотеку LMAX Disruptor, которая снижает потребность в блокировках ядра и увеличивает производительность логирования в 12 раз. Например, в одной и той же среде Log4j 2 может записывать более 18 000 000 сообщений в секунду, в то время как другие фреймворки, такие как Logback и Log4j 1, записывают менее 2 000 000 сообщений в секунду.
the Java logging framework
Apache Log4j is a Java based logging utility originally written by Ceki Gülcü. It is part of the Apache Logging Services, a project of the Apache Software Foundation. Log4j is one of several Java logging frameworks. Gülcü has since created SLF4J, Reload4j, and Logback which are alternatives to Log4j. The Apache Log4j team developed Log4j 2 in response to the problems of Log4j 1.2, 1.3, java. util. logging and Logback, addressing issues which appeared in those frameworks. In addition, Log4j 2 offered a plugin architecture which makes it more extensible than its predecessor. Log4j 2 is not backwards compatible with 1. x versions, although an "adapter" is available. On August 5, 2015, the Apache Logging Services Project Management Committee announced that Log4j 1 had reached end of life and that users of Log4j 1 were advised to upgrade to Apache Log4j 2. On January 12, 2022, a forked and renamed log4j version 1.2 was released by Ceki Gülcü as Reload4j version 1.2.18.0 with the aim of fixing the most urgent issues in log4j 1.2.17 that had accumulated since its release in 2013. On December 9, 2021, a zero day vulnerability involving arbitrary code execution in Log4j 2 was published by the Alibaba Cloud Security Team and given the descriptor "Log4Shell". from Log4j 1 are:
Improved reliability. Messages are not lost while reconfiguring the framework like in Log4j 1 or Logback
Extensibility: Log4j 2 supports a plugin system to let users define and configure custom components
Simplified configuration syntax
Support for xml, json, yaml and properties configurations
Improved filters
Property lookup support for values defined in the configuration file, system properties, environment variables, the ThreadContext Map, and data present in the event
Support for multiple APIs: Log4j 2 can be used with applications using the Log4j 2, Log4j 1.2, SLF4J, Commons Logging and java. util. logging (JUL) APIs. Custom log levels
Java 8 style lambda support for "lazy logging"
Markers
Support for user defined Message objects
"Garbage free or low garbage" in common configurations
Improved speed
Improved support for Linux
One of the most recognized features of Log4j 2 is the performance of the "Asynchronous Loggers". Log4j 2 makes use of the LMAX Disruptor. The library reduces the need for kernel locking and increases the logging performance by a factor of 12. For example, in the same environment Log4j 2 can write more than 18,000,000 messages per second, whereas other frameworks like Logback and Log4j 1 just write < 2,000,000 messages per second.
Лог4j лог-уровне
В следующей таблице определены встроенные уровни логирования и сообщения в Log4j, в порядке убывания серьезности. В левой колонке указано обозначение уровня логирования в Log4j, а в правой колонке приведено краткое описание каждого уровня.
Уровень Описание
OFF Наивысший возможный уровень и предназначен для отключения логирования.
FATAL Критические ошибки, приводящие к преждевременному завершению работы. Ожидается, что они будут немедленно отображаться на консоли статуса.
ERROR Другие ошибки времени выполнения или неожиданные ситуации. Ожидается, что они будут немедленно отображаться на консоли статуса.
WARN Использование устаревших API, неоптимальное использование API, "почти" ошибки, другие нежелательные или неожиданные ситуации во время выполнения, но не обязательно являющиеся ошибками. Ожидается, что они будут немедленно отображаться на консоли статуса.
INFO Интересные события времени выполнения (запуск/остановка). Ожидается, что они будут отображаться на консоли, поэтому следует использовать их умеренно и ограничивать количество.
DEBUG Подробная информация о потоке выполнения в системе. Ожидается, что они будут записываться только в логи. В общем случае, большинство строк, записываемых вашим приложением, должны быть записаны как DEBUG.
TRACE Наиболее детальная информация. Ожидается, что они будут записываться только в логи. Начиная с версии 1.2.12.
Настраиваемые уровни журналов
Log4j 2 позволяет пользователям определять собственные уровни логирования. Предоставляется инструмент генерации исходного кода для создания логгеров, поддерживающих пользовательские уровни логирования аналогично встроенным. Пользовательские уровни логирования могут дополнять или заменять встроенные уровни логирования.
Порты
log4c – Порт для C. Log4C – это библиотека журналирования на языке C, выпущенная на SourceForge под лицензией LGPL. Для различных операционных систем Unix предоставляются файлы autoconf и automake. Для Windows предусмотрен Makefile для использования с MSVC. Разработчики также могут выбрать собственную систему сборки для компиляции исходного кода, в зависимости от требований к процессу сборки. Экземпляр библиотеки log4c можно настроить тремя способами: с использованием переменных окружения, программно или через XML-файл конфигурации. Log4c имеет аппендеры для файлов, потоков и файлов, отображаемых в память. (Адаптер сокетов отсутствует). Последняя версия – 1.2.4, выпущенная в 2013 году, и проект больше не активно поддерживается. log4js – Порт для JavaScript. Log4js доступен под лицензией Apache Software Foundation. Одной из особенностей Log4js является возможность удалённого журналирования событий браузера на сервере. С помощью Ajax можно отправлять события журналирования в различных форматах (XML, JSON, обычный ASCII и т.д.) на сервер для последующей обработки. Для log4js реализованы следующие аппендеры: AjaxAppender, ConsoleAppender, FileAppender, JSConsoleAppender, MetatagAppender и WindowsEventsAppender. Предоставлены следующие классы Layout: BasicLayout, HtmlLayout, JSONLayout и XMLLayout. Последняя версия на 2021 год – 2.0 от 18 октября 2018 года. log4javascript – Ещё один порт для JavaScript. log4javascript – это JavaScript-фреймворк для журналирования, основанный на log4j. Последняя версия по состоянию на 2021 год – 1.4.13, выпущенная 23 мая 2015 года. JSNLog – Порт для JavaScript. Автоматически помещает сообщения из JavaScript-логгеров в серверные журналы, используя компонент на стороне сервера .NET, который взаимодействует с Log4Net, NLog, Elmah или Common.Logging. Это обеспечивает интегрированное журналирование событий на стороне клиента и сервера. Идентификаторы запросов сопоставляются с событиями, относящимися к конкретному пользователю. Конфигурация осуществляется через веб-файл конфигурации на стороне сервера. Поддерживается журналирование исключений, включая трассировку стека. По состоянию на 2021 год последняя версия – 3.0.0, и обновления выпускались регулярно. Apache Log4net – Порт для Microsoft .NET Framework. Первоначальная работа была выполнена Neoworks и передана в Apache Software Foundation в феврале 2004 года. Фреймворк аналогичен оригинальному log4j, но использует новые возможности среды выполнения .NET. Предоставляет Nested Diagnostic Context (NDC) и Mapped Diagnostic Context (MDC). Последняя версия на 2022 год – 2.0.15. log4perl – Perl-порт log4j. Версия 1.49 от февраля 2017 года была актуальна по состоянию на 2021 год. Apache log4php – "Универсальный фреймворк для журналирования на PHP. Изначально являлся портом Apache log4j на PHP, но со временем был расширен и включает различные функции, специфичные для PHP." PL SQL Logging Utility – это адаптация log4j в PL/SQL. Log4db2 – это утилита журналирования для DB2 for LUW, использующая инструкции SQL с кодом SQL PL. Apache Log4cxx – фреймворк для журналирования на C++, основанный на Apache log4j, который использует Apache Portable Runtime для большей части платформенно-зависимого кода и должен быть работоспособен на любой платформе, поддерживаемой APR. Последняя версия – 0.13.0, выпущенная в 2022 году. Log4r – всеобъемлющая и гибкая библиотека журналирования, написанная на Ruby для использования в Ruby-программах. Она вдохновлена и предоставляет большую часть функциональности проекта Apache Log4j.
log4javascript – Another port for JavaScript. log4javascript is a JavaScript logging framework based on the log4j. The latest version as of 2021 was 1.4.13, released on 23 May 2015. JSNLog – A port for JavaScript. Automatically places messages from JavaScript loggers in server side logs using a NET server side component that interfaces with Log4Net, NLog, Elmah or Common. Logging. This to provide an integrated log for client and server side events. Request ids correlate events related to a specific user. Configuration is via a server side web. config file. Supports exception logging including stack traces. as of 2021 the latest version was 3.0.0 and updates were made regularly. Apache Log4net – A port to the Microsoft NET Framework. The initial work was done by Neoworks and was donated to the Apache Software Foundation in February 2004. The framework is similar to the original log4j while taking advantage of new features in the NET runtime. Provides Nested Diagnostic Context (NDC) and Mapped Diagnostic Context (MDC). The latest version as of 2022 was 2.0.15.
log4perl – A Perl port of log4j. Version 1.49 of February 2017 was current as of 2021. Apache log4php – "A versatile logging framework for PHP. Originally a port of Apache log4j to PHP, it has grown to include various PHP specific features." PL SQL Logging Utility is an adaptation of log4j in PL/SQL. Log4db2 is a logging utility for DB2 for LUW that uses SQL instructions with SQL PL code. Apache Log4cxx – A logging framework for C++ patterned after Apache log4j, which uses Apache Portable Runtime for most platform specific code and should be usable on any platform supported by APR. The latest version is 0.13.0, released in 2022. Log4r – A comprehensive and flexible logging library written in Ruby for use in Ruby programs. It was inspired by and provides much of the features of the Apache Log4j project.
Уязвимость Log4Shell
24 ноября 2021 года компания Alibaba обнаружила уязвимость нулевого дня, связанную с удаленным выполнением кода в Log4j 2, получившую обозначение "Log4Shell" (CVE 2021-44228), и сообщила об этом Apache. Информация об уязвимости была опубликована в Twitter 9 декабря 2021 года. Подверженные воздействию сервисы включают Cloudflare, iCloud, Minecraft: Java Edition, Steam, Tencent QQ и Twitter. Фонд Apache Software Foundation присвоил Log4Shell максимальную оценку критичности по шкале CVSS – 10, поскольку миллионы серверов потенциально могут быть уязвимы для эксплуатации. Компания Lunasec в своем анализе Free Wortley охарактеризовала уязвимость как "катастрофический сбой в проектировании". В Соединенных Штатах директор Агентства по кибербезопасности и инфраструктурной безопасности (CISA) Джен Истерли назвала эксплойт "критическим" и рекомендовала поставщикам программного обеспечения приоритизировать обновления, а Федеральное управление по информационной безопасности (BSI) Германии отнесло эксплойт к наивысшему уровню угрозы, назвав ситуацию "чрезвычайно критической". Канадский центр кибербезопасности (CCCS) призвал организации к немедленным действиям. Уязвимую функцию можно было отключить с помощью настройки конфигурации, которая была удалена в Log4j версии 2.15.0 rc1 (официально выпущена 6 декабря 2021 года, за три дня до публикации информации об уязвимости) и заменена различными настройками, ограничивающими удаленные запросы, что позволило снизить риск эксплуатации. В целях дополнительной безопасности все функции, использующие JNDI, лежащие в основе данной уязвимости, будут отключены по умолчанию, а поддержка поиска сообщений будет удалена начиная с версии 2.16.0.