![]() | |
Разработчик(и) | Фонд программного обеспечения Apache |
---|---|
Первоначальный выпуск | 8 января 2001 г ( 2001-01-08 ) | [1]
Стабильный релиз | 2.24.3 [2] / 13 декабря 2024 г. ( 13 декабря 2024 ) [3] |
Репозиторий | github.com/apache/logging-log4j2 |
Написано в | Ява |
Операционная система | Кроссплатформенный |
Тип | Ведение журнала |
Лицензия | Лицензия Apache 2.0 |
Веб-сайт | logging.apache.org/log4j/2.x/ |
Apache Log4j — это основанная на Java утилита ведения журнала , изначально написанная Ceki Gülcü. Она является частью Apache Logging Services, проекта Apache Software Foundation . Log4j — одна из нескольких фреймворков ведения журнала Java .
С тех пор Гюльджю создал SLF4J , Reload4j, [4] и Logback [5] [ нужен лучший источник ], которые являются альтернативами Log4j. [6]
Команда Apache Log4j разработала Log4j 2 [7] в ответ на проблемы Log4j 1.2, 1.3 java.util.logging
и Logback, решая проблемы, которые возникли в этих фреймворках. [8] Кроме того, Log4j 2 предлагал архитектуру плагинов, которая делала его более расширяемым, чем его предшественник. Log4j 2 не имеет обратной совместимости с версиями 1.x, [9] хотя «адаптер» доступен. 5 августа 2015 года Комитет по управлению проектами Apache Logging Services объявил, что Log4j 1 подошел к концу и пользователям Log4j 1 было рекомендовано обновиться до Apache Log4j 2. [10] 12 января 2022 года Ceki Gülcü выпустил ответвленную и переименованную версию log4j 1.2 как Reload4j версии 1.2.18.0 с целью исправления наиболее острых проблем в log4j 1.2.17, накопившихся с момента его выпуска в 2013 году. [11]
9 декабря 2021 года команда Alibaba Cloud Security Team опубликовала уязвимость нулевого дня , связанную с выполнением произвольного кода в Log4j 2, и ей было присвоено обозначение « Log4Shell ». [12] Tenable охарактеризовал ее как «самую большую и критическую уязвимость последнего десятилетия». [13]
Apache Log4j 2 является преемником Log4j 1, который был выпущен как версия GA в июле 2015 года. Фреймворк был переписан с нуля и вдохновлен существующими решениями для ведения журналов, включая Log4j 1 и java.util.logging. Основные отличия [14] [15] от Log4j 1:
Одной из самых узнаваемых особенностей Log4j 2 является производительность «асинхронных регистраторов». [16] Log4j 2 использует LMAX Disruptor . [17] Библиотека снижает необходимость в блокировке ядра и увеличивает производительность ведения журнала в 12 раз. Например, в той же среде Log4j 2 может записывать более 18 000 000 сообщений в секунду, тогда как другие фреймворки, такие как Logback и Log4j 1, записывают всего < 2 000 000 сообщений в секунду.
В следующей таблице определены встроенные уровни журнала и сообщения в Log4j в порядке убывания серьезности. В левом столбце перечислены обозначения уровня журнала в Log4j, а в правом столбце дано краткое описание каждого уровня журнала.
Уровень | Описание |
---|---|
ВЫКЛЮЧЕННЫЙ | Наивысший возможный ранг, предназначенный для отключения ведения журнала. |
ФАТАЛЬНЫЙ | Серьезные ошибки, которые приводят к преждевременному завершению. Ожидайте, что они будут немедленно видны на консоли состояния. |
ОШИБКА | Другие ошибки времени выполнения или непредвиденные условия. Ожидайте, что они будут немедленно видны на консоли состояния. |
ПРЕДУПРЕЖДАТЬ | Использование устаревших API, плохое использование API, «почти» ошибки, другие ситуации во время выполнения, которые нежелательны или неожиданны, но не обязательно «неправильны». Ожидайте, что они будут немедленно видны на консоли состояния. |
ИНФОРМАЦИЯ | Интересные события времени выполнения (запуск/выключение). Ожидайте, что они будут немедленно видны на консоли, поэтому будьте осторожны и сведите их к минимуму. |
ОТЛАЖИВАТЬ | Подробная информация о потоке через систему. Ожидайте, что они будут записаны только в журналы. Вообще говоря, большинство строк, регистрируемых вашим приложением, должны быть записаны как DEBUG. |
СЛЕД | Наиболее подробная информация. Ожидается, что они будут записаны только в журналы. Начиная с версии 1.2.12. [18] |
Log4j 2 позволяет пользователям определять собственные уровни журнала. [19] Предоставляется инструмент генератора исходного кода для создания Loggers, которые поддерживают пользовательские уровни журнала, идентичные встроенным уровням журнала. Пользовательские уровни журнала могут либо дополнять, либо заменять встроенные уровни журнала.
Log4j можно настроить [20] через файл конфигурации или через код Java. Файлы конфигурации могут быть написаны в формате XML , JSON , YAML или файла свойств . Можно определить три основных компонента: регистраторы, аппендеры и макеты. Настройка ведения журнала через файл имеет то преимущество, что ведение журнала можно включать и выключать без изменения приложения, использующего Log4j. Например, приложению можно разрешить работать с отключенным ведением журнала, пока не возникнет проблема, а затем ведение журнала можно включить снова, просто изменив файл конфигурации.
Регистраторы [21] называются пунктами назначения сообщений журнала. Это имена, которые известны приложению Java. Каждый регистратор независимо настраивается относительно того, какой уровень журналирования (FATAL, ERROR и т. д.) он в данный момент регистрирует. В ранних версиях Log4j они назывались категория и приоритет, но теперь они называются регистратор и уровень соответственно. Регистратор может отправлять сообщения журнала нескольким Appenders.
Фактические выходные данные создаются Appenders . [22] Доступно множество Appenders с описательными именами, такими как FileAppender, RollingFileAppender, ConsoleAppender, SocketAppender, SyslogAppender и SMTPAppender. В Log4j 2 добавлены Appenders, которые записывают в Apache Flume , Java Persistence API , Apache Kafka , базы данных NoSQL , файлы с отображением в памяти , файлы с произвольным доступом [23] и конечные точки ZeroMQ . К любому Logger можно присоединить несколько Appenders, поэтому можно регистрировать одну и ту же информацию в нескольких выходах; например, в файл локально и в прослушиватель сокета на другом компьютере.
Appenders используют Layouts [24] для форматирования записей журнала. Популярным способом форматирования файлов журнала по одной строке за раз является PatternLayout, который использует строку шаблона, во многом похожую на функцию C / C++ printf . Существуют также форматировщики HTMLLayout и XMLLayout для использования, когда форматы HTML или XML более удобны, соответственно. Log4j 2 добавил Layouts для CSV , Graylog Extended Log Format (GELF), [25] JSON , YAML и RFC-5424. [26]
В Log4j 2 фильтры [27] могут быть определены в элементах конфигурации, чтобы обеспечить более детальный контроль над тем, какие записи журнала должны обрабатываться какими Loggers и Appenders. В дополнение к фильтрации по уровню журнала и сопоставлению регулярных выражений в строке сообщения, Log4j 2 добавил пакетные фильтры, временные фильтры, фильтрацию по другим атрибутам событий журнала, таким как маркеры или карта контекста потока, а также фильтры скриптов JSR 223 .
Чтобы отладить некорректно работающую конфигурацию:
status
атрибут на TRACE для отправки внутреннего вывода журнала состояния на стандартный вывод . Чтобы включить журнал состояния до того, как будет найдена конфигурация, используйте свойство Java VM -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=trace
.-Dlog4j.debug
.Чтобы узнать, откуда был загружен файл конфигурации log4j2.xml, выполните проверку getClass().getResource("/log4j2.xml")
.
Существует также неявная "ненастроенная" или "по умолчанию" конфигурация Log4j, то есть Java-приложение, инструментированное Log4j, в котором отсутствует какая-либо конфигурация Log4j. Это выводит на stdout предупреждение о том, что программа не настроена, и URL-адрес веб-сайта Log4j, где можно найти подробную информацию о предупреждении и конфигурации. Помимо печати этого предупреждения, ненастроенное приложение Log4j будет выводить только записи журнала ERROR или FATAL на стандартный вывод.
<?xml version="1.0" encoding="UTF-8"?> <Configuration status= "trace" monitorInterval= "60" > <Properties> <Property name= "filename" > target/test.log </Property> </Properties> <Appenders> <Console name= "STDOUT" > <PatternLayout pattern= "%d %p %c{1.} [%t] %m%n" /> </Console> <File name= "file" fileName= "${filename}" > <PatternLayout> <pattern> %d %p %c{1.} [%t] %m%n </pattern> </PatternLayout> </File> </Appenders> <Loggers> <!-- loggers, имя которого начинается с 'org.springframework', будут регистрировать только сообщения уровня "info" или выше; если вы извлекаете Loggers, используя имя класса (например, Logger.getLogger(AClass.class)) и если AClass является частью пакета org.springframework, он будет относиться к этой категории --> <Logger name= "org.springframework" level= "info" additivity= "false" /> <!-- Пример фильтра: для регистраторов, имя которых начинается с 'com.mycompany.myproduct', записи журнала уровня "debug" или выше, данные ThreadContextMap которых содержат пару ключ-значение "test=123", также отправляют эти записи журнала в аппендэр "STDOUT". --> <Logger name= "com.mycompany.myproduct" level= "debug" additivity= "true" > <ThreadContextMapFilter> <KeyValuePair key= "test" value= "123" /> </ThreadContextMapFilter> <AppenderRef ref= "STDOUT" /> </Logger> <!-- По умолчанию все сообщения журнала уровня "trace" или выше будут зарегистрированы. Сообщения журнала отправляются в аппендэр "file", а сообщения журнала уровня "error" и выше будут отправлены в аппендэр "STDOUT". --> <Корневой уровень = "трассировка" > <AppenderRef ref = "файл" /> <AppenderRef ref = "STDOUT" level = "ошибка" /> </Корень> < /Журналисты> </ Конфигурация>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> <log4j:configuration> <!-- Аппендер — это место назначения вывода, например консоль или файл; имена аппендеров выбираются произвольно. --> <appender name= "stdout" class= "org.apache.log4j.ConsoleAppender" > <layout class= "org.apache.log4j.PatternLayout" > <param name= "ConversionPattern" value= "%d{ABSOLUTE} %5p %c{1}:%L - %m%n" /> </layout> </appender> <!-- регистраторы категории 'org.springframework' будут регистрировать только сообщения уровня "info" или выше; если вы извлекаете регистраторы, используя имя класса (например, Logger.getLogger(AClass.class)) и если AClass является частью пакета org.springframework, он будет принадлежать к этой категории --> <logger name= "org.springframework" > <level value= "info" /> </logger> <!-- все в spring было установлено на "info", но для класса PropertyEditorRegistrySupport мы хотим вести журнал "debug" --> <logger name= "org.springframework.beans.PropertyEditorRegistrySupport" > <level value= "debug" /> </logger> <logger name= "org.acegisecurity" > <level value= "info" /> </logger> <root> <!-- все сообщения журнала уровня "debug" или выше будут записаны в журнал, если не указано иное, все сообщения журнала будут записаны в "stdout" аппендера, если не указано иное --> <level value= "debug" /> <appender-ref ref= "stdout" /> </root> </log4j:configuration>
TTCC — это формат сообщений, используемый log4j. [28] TTCC — это аббревиатура от Time Thread Category Component . Он использует следующий шаблон:
%r [%t] %-5p %c %x - %m%n
Где
Мнемонический | Описание |
---|---|
%р | Используется для вывода количества миллисекунд, прошедших с момента построения макета до создания события регистрации. |
%т | Используется для вывода имени потока, сгенерировавшего событие регистрации. |
%р | Используется для вывода приоритета события регистрации. |
%с | Используется для вывода категории регистрируемого события. |
%х | Используется для вывода NDC (вложенного диагностического контекста), связанного с потоком, сгенерировавшим событие регистрации. [29] |
%X{ключ} | Используется для вывода MDC (сопоставленного диагностического контекста), связанного с потоком, который сгенерировал событие регистрации для указанного ключа. [30] |
%м | Используется для вывода предоставленного приложением сообщения, связанного с событием регистрации. |
%н | Используется для вывода специфичных для платформы символов новой строки . |
Пример вывода
467 [main] ИНФОРМАЦИЯ org.apache.log4j.examples.Sort – Выход из основного метода.
Уязвимость нулевого дня, включающая удаленное выполнение кода в Log4j 2, с дескриптором «Log4Shell» ( CVE -2021-44228), была обнаружена и сообщена Apache компанией Alibaba 24 ноября 2021 года и опубликована в твите 9 декабря 2021 года. [12] К затронутым сервисам относятся Cloudflare , iCloud , Minecraft: Java Edition , [42] Steam , Tencent QQ и Twitter . [43] [44] [45] Apache Software Foundation присвоила Log4Shell максимальный рейтинг серьезности CVSS 10, поскольку миллионы серверов могут быть потенциально уязвимы для эксплойта. [45] Компания по кибербезопасности Tenable охарактеризовала уязвимость как «самую большую и критическую уязвимость последнего десятилетия» [13] , а Free Wortley из Lunasec охарактеризовала ее как «проектный провал катастрофических масштабов». [46]
В Соединенных Штатах директор Агентства по кибербезопасности и безопасности инфраструктуры (CISA) Джен Истерли назвала эксплойт «критическим» и посоветовала поставщикам отдать приоритет обновлениям программного обеспечения, [47] а немецкое агентство Федеральное управление по информационной безопасности (BSI) обозначило эксплойт как имеющий наивысший уровень угрозы, назвав его «чрезвычайно критической ситуацией угрозы» (перевод). [48] [49] Канадский центр кибербезопасности (CCCS) призвал организации принять немедленные меры. [50]
Функцию, вызывающую уязвимость, можно отключить с помощью параметра конфигурации, который был удален [51] в Log4j версии 2.15.0-rc1 (официально выпущенной 6 декабря 2021 года, за три дня до публикации уязвимости) и заменен различными настройками, ограничивающими удаленный поиск, тем самым смягчая уязвимость. [52] [53] Для дополнительной безопасности все функции, использующие JNDI , на которых основана эта уязвимость, будут отключены по умолчанию, а поддержка поиска сообщений будет удалена с версии 2.16.0 и далее. [54] [55]
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь )