JavaRush/Курсы/JSP & Servlets/Фильтры логов в Log4j

Фильтры логов в Log4j

Открыта

5.1 Список фильтров

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

Фильтры Описание
1 BurstFilter Позволяет управлять частотой сообщений в секунду для заданного уровня логирования.
2 CompositeFilter Позволяет задать несколько последовательных фильтров.
3 DynamicThresholdFilter Позволяет включать детальное логирование, если в логе встретилась определенная информация.
4 MapFilter Позволяет построить сложное логическое выражение для фильтра из нескольких параметров.
5 MarkerFilter Позволяет фильтровать сообщения по тегам, тег предварительно должен быть добавлен во время логирования события.
6 RegexFilter Позволяет задать маску – регулярное выражение.
7 StructuredDataFilter Позволяет фильтровать сообщения по наличию в них определенных данных.
8 ThreadContextMapFilter Позволяет управлять фильтрами на основе данных, взятых из контекста текущего потока.
9 ThresholdFilter Управляет логированием на основе уровня сообщения лога.
10 TimeFilter Позволяет включать и выключать фильтры в определенное время.

Ниже мы расскажем всего про три из них. Более детально вы можете ознакомиться с этими фильтрами на их официальном сайте.

5.2 TimeFilter

Фильтр TimeFilter позволяет включать и выключать фильтры в определенное время, имеет 5 параметров:

1 start Время старта логирования в формате HH:mm:ss
2 end Время выключения логирования в формате HH:mm:ss
3 timezone Задает временную зону.
4 onMatch Как логировать, если условие фильтра истинно. Может быть ACCEPT, DENY или NEUTRAL. По умолчанию NEUTRAL.
5 onMismatch Как логировать, если условие фильтра ложно. Может быть ACCEPT, DENY или NEUTRAL. По умолчанию NEUTRAL.

Давайте настроим фильтр, который будет включать логирование в 5 утра и выключать его в 5:30 утра каждый день. Пример с полной конфигурацией фильтра ниже:

<?xml version="1.0" encoding="UTF-8"?>
   <Configuration status="warn" name="MyApp" packages="">
   <Appenders>
       <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
<TimeFilter start="05:00:00" end="05:30:00" onMatch="ACCEPT" onMismatch="DENY"/>
       <PatternLayout>
           <pattern>%d %p %c{1.} [%t] %m%n</pattern>
       </PatternLayout>
       <TimeBasedTriggeringPolicy />
       </RollingFile>
   </Appenders>
   <Loggers>
       <Root level="error">
       <AppenderRef ref="RollingFile"/>
       </Root>
   </Loggers>
   </Configuration>

5.3 RegexFilter

Фильтр RegexFilter позволяет задать маску (регулярное выражение) для фильтрации сообщений. Этот фильтр имеет 4 параметра:

1 regex Задает регулярное выражение – маску, которая применяется для фильтрации сообщений.HH:mm:ss
2 useRawMsg Маска применяется в сообщении до форматирования (true) или после форматирования (false)
3 onMatch Как логировать, если условие фильтра истинно. Может быть ACCEPT, DENY или NEUTRAL. По умолчанию NEUTRAL.
4 onMismatch Как логировать, если условие фильтра ложно. Может быть ACCEPT, DENY или NEUTRAL. По умолчанию NEUTRAL.

Давайте настроим фильтр, который будет пропускать только сообщения, содержащие слово javarush. Пример с полной конфигурацией фильтра ниже:

<?xml version="1.0" encoding="UTF-8"?>
   <Configuration status="warn" name="MyApp" packages="">
   <Appenders>
       <RollingFile name="RollingFile" fileName="logs/app.log"   filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
<RegexFilter regex=".* javarush .*" onMatch="ACCEPT" onMismatch="DENY"/>
       <PatternLayout>
           <pattern>%d %p %c{1.} [%t] %m%n</pattern>
       </PatternLayout>
       <TimeBasedTriggeringPolicy />
       </RollingFile>
     </Appenders>
   <Loggers>
       <Root level="error">
       <AppenderRef ref="RollingFile"/>
       </Root>
   </Loggers>
   </Configuration>

5.4 ThresholdFilter

Фильтр ThresholdFilter позволяет настроить фильтрацию по уровню сообщений. Он имеет всего 3 параметра:

1 level Задает имя уровня логирования сообщений: ERROR, DEBUG, …
2 onMatch Как логировать, если условие фильтра истинно. Может быть ACCEPT, DENY или NEUTRAL. По умолчанию NEUTRAL.
3 onMismatch Как логировать, если условие фильтра ложно. Может быть ACCEPT, DENY или NEUTRAL. По умолчанию NEUTRAL.

Давайте настроим фильтр, который будет пропускать только сообщения уровня DEBUG. Пример с полной конфигурацией фильтра ниже:

<?xml version="1.0" encoding="UTF-8"?>
   <Configuration status="warn" name="MyApp" packages="">
   <Appenders>
       <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
       <PatternLayout>
           <pattern>%d %p %c{1.} [%t] %m%n</pattern>
       </PatternLayout>
       <TimeBasedTriggeringPolicy />
       </RollingFile>
   </Appenders>
   <Loggers>
       <Root level="error">
       <AppenderRef ref="RollingFile"/>
       </Root>
   </Loggers>
   </Configuration>
Комментарии (17)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Virgilion
Уровень 41
31 октября 2024, 15:18
Помогите, пожалуйста, разобраться в этом начальном фрагменте файла log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns="https://logging.apache.org/xml/ns"
               xsi:schemaLocation="
                       https://logging.apache.org/xml/ns
                       https://logging.apache.org/xml/ns/log4j-config-2.xsd">
что это и для чего?
Роман
Уровень 88
28 октября 2024, 14:58
что я только что прочитал вообще
Virgilion
Уровень 41
31 октября 2024, 15:23
На самом деле, в официальной документации всё гораздо понятнее. https://logging.apache.org/log4j/2.x/manual/getting-started.html Прочитав лекцию - долго пытался понять что и с чем едят. А тут всё объясняется, от того где файл конфигурации и с каким именем создать, до разбора форматирования шаблонов.
Yaroslav
Уровень 109
Expert
19 мая 2024, 16:04
Чёт ThresholdFilter в данной конфигурации пропускает всё от уровня DEBUG, а не только его
jvatechsBackend Developer в Ищу стажировкуExpert
19 мая 2023, 22:51
Насчет RegexFilter:
<RegexFilter regex=".* javarush .*" onMatch="ACCEPT" onMismatch="DENY"/>
лишние пробелы по краям javarush, должно быть так:
<RegexFilter regex=".*javarush.*" onMatch="ACCEPT" onMismatch="DENY"/>
Насчет ThresholdFilter: debug и info не будут пропускаться, ибо в Root level прописан уровень error. Надо поменять это:
<Root level="error">
на это:
<Root level="debug">
jvatechsBackend Developer в Ищу стажировкуExpert
19 мая 2023, 04:43
Log4j имеет возможность автоматически конфигурироваться во время инициализации. Когда Log4j запустится, он найдет все плагины ConfigurationFactory и упорядочит их в порядке взвешивания от самого высокого к самому низкому. В состоянии поставки Log4j содержит четыре реализации ConfigurationFactory: одну для JSON, одну для YAML, одну для свойств и одну для XML. 1) Log4j проверит "log4j2.configurationFile"системное свойство и, если оно установлено, попытается загрузить конфигурацию, используя расширение, ConfigurationFactoryсоответствующее расширению файла. Обратите внимание, что это не ограничивается расположением в локальной файловой системе и может содержать URL-адрес. 2) Если системное свойство не установлено, свойства ConfigurationFactory будут искать log4j2-test.propertiesв пути к классам. 3) Если такой файл не найден, YAML ConfigurationFactory будет искать log4j2-test.yamlили log4j2-test.ymlв пути к классам. 4) Если такой файл не найден, JSON ConfigurationFactory будет искать log4j2-test.jsonили log4j2-test.jsnв пути к классам. 5) Если такой файл не найден, XML ConfigurationFactory будет искать его log4j2-test.xmlв пути к классам. 6) Если тестовый файл не может быть найден, ConfigurationFactory будет искать свойства log4j2.propertiesв пути к классам. 7) Если файл свойств не может быть найден, YAML ConfigurationFactory будет искать log4j2.yamlили log4j2.ymlв пути к классам. 8) Если файл YAML не может быть найден, JSON ConfigurationFactory будет искать log4j2.jsonили log4j2.jsnв пути к классам. 9) Если не удается найти файл JSON, XML ConfigurationFactory попытается найти его log4j2.xmlв пути к классам. 10) Если файл конфигурации не может быть найден, он DefaultConfigurationбудет использоваться. Это приведет к тому, что вывод журнала будет отправлен на консоль.
jvatechsBackend Developer в Ищу стажировкуExpert
19 мая 2023, 04:34
Про порядок получения конфигураций советую прочитать вот тут: https://logging.apache.org/log4j/2.x/manual/configuration.html Скрин:
JavaCoder
Уровень 51
17 ноября 2022, 11:00
Во всех трех описанных видах фильтров параметр onMismatch имеет значение по умолчанию DENY, а не NEUTRAL.
Andrey PanchenkoМоет полы в Яндекс
15 сентября 2022, 12:53
Очень непонятно, как будто заметки чьи-то личные читаю.
Гришин Роман
Уровень 56
8 сентября 2022, 18:57
Почему в лекции не указывается, что конфигурация log4j может быть как по log4j.xml, так и по log4j.properties???
Anonymous #3322801
Уровень 5
Expert
24 июля 2023, 13:41
Видимо чтобы мы сами накопали эту инфу, а вообще лучше читать мануал, там прям с первых строк об этом сказано.
Nikita Shamrai Backend Developer Expert
27 июля 2022, 12:01
Откуда вдруг взялся xml файл если в properties никакого xml не было?