Введение

Программное обеспечение для ведения журналов на основе 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.

Одной из наиболее заметных особенностей Log4j 2 является производительность "Асинхронных логгеров". Log4j 2 использует библиотеку LMAX Disruptor, которая снижает потребность в блокировках ядра и увеличивает производительность логирования в 12 раз. Например, в одной и той же среде Log4j 2 может записывать более 18 000 000 сообщений в секунду, в то время как другие фреймворки, такие как Logback и Log4j 1, записывают менее 2 000 000 сообщений в секунду.

Лог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.

Уязвимость 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.