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

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

JSP & Servlets
5 уровень , 4 лекция
Открыта

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
Помогите, пожалуйста, разобраться в этом начальном фрагменте файла 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
что я только что прочитал вообще
Virgilion Уровень 41
31 октября 2024
На самом деле, в официальной документации всё гораздо понятнее. https://logging.apache.org/log4j/2.x/manual/getting-started.html Прочитав лекцию - долго пытался понять что и с чем едят. А тут всё объясняется, от того где файл конфигурации и с каким именем создать, до разбора форматирования шаблонов.
Yaroslav Уровень 109 Expert
19 мая 2024
Чёт ThresholdFilter в данной конфигурации пропускает всё от уровня DEBUG, а не только его
jvatechs Уровень 111 Expert
19 мая 2023
Насчет 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">
jvatechs Уровень 111 Expert
19 мая 2023
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будет использоваться. Это приведет к тому, что вывод журнала будет отправлен на консоль.
jvatechs Уровень 111 Expert
19 мая 2023
Про порядок получения конфигураций советую прочитать вот тут: https://logging.apache.org/log4j/2.x/manual/configuration.html Скрин:
JavaCoder Уровень 51
17 ноября 2022
Во всех трех описанных видах фильтров параметр onMismatch имеет значение по умолчанию DENY, а не NEUTRAL.
Andrey Panchenko Уровень 26
15 сентября 2022
Очень непонятно, как будто заметки чьи-то личные читаю.
Гришин Роман Уровень 56
8 сентября 2022
Почему в лекции не указывается, что конфигурация log4j может быть как по log4j.xml, так и по log4j.properties???
Anonymous #3322801 Уровень 2 Expert
24 июля 2023
Видимо чтобы мы сами накопали эту инфу, а вообще лучше читать мануал, там прям с первых строк об этом сказано.
Nikita Shamrai Уровень 8 Expert
27 июля 2022
Откуда вдруг взялся xml файл если в properties никакого xml не было?