Log4j2 Regexfilter, кажется, игнорирует конфигурацию фильтра - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь отфильтровать Apache Tomcat события запуска (/ выключения) из обычного ведения журнала приложения для стороннего инструмента, который управляет жизненным циклом приложения различных экземпляров Tomcat. Основой является Log4j2 (2.12.1) с использованием Regexfilter в Appender Context для простого File аппендера (пример, приведенный ниже, с простым указанием, включая жестко заданные значения):

<Properties>
    <Property name="fileName" value="logs/application.log" />
    <Property name="filePattern" value="logs/application-%d{MM-dd-yyyy}-%i.log.gz" />
    <Property name="pattern" value="%d{ISO8601} %-5p %c - [%t] %m %n"/>
</Properties>
<Appenders>
    <RollingFile name="APPLICATION" fileName="${fileName}" filePattern="${filePattern}" bufferedIO="true" append="true">
        <PatternLayout pattern="${pattern}" alwaysWriteExceptions="true" />
        <Policies>
            <TimeBasedTriggeringPolicy />
            <SizeBasedTriggeringPolicy size="50 MB"/>
        </Policies>
        <DefaultRolloverStrategy min="1" max="5" compressionLevel="5" />
    </RollingFile>
    <File name="STARTUP" fileName="logs/startup.log" bufferedIO="true" immediateFlush="true" append="true">
        <PatternLayout>
            <Pattern>%d %m%n</Pattern>
        </PatternLayout>
        <Filters>
            <RegexFilter regex=".* startup .*" onMatch="ACCEPT" onMismatch="DENY"/>
            <RegexFilter regex=".* Java Home .*" onMatch="ACCEPT" onMismatch="DENY"/>
        <Filters>
    </File>
</Appenders>

Соответствующий регистратор выглядит следующим образом:

<Logger name="org.apache.catalina.startup" level="INFO" additivity="false">
    <Appender-ref ref="STARTUP"  />
    <Appender-ref ref="APPLICATION"  />
</Logger>

Когда я запускаю экземпляр, создаются оба файла журнала. Однако только файл журнала приложения (приложение APPLICATION) содержит записи, в том числе те, которые я заинтересован в фильтрации:

[ec2-user@AWS:./logs] $ grep -Ern "\[main\].*Java Home|\[main\].*Server startup" application.log
4415:2020-03-26T17:40:15,226 INFO  org.apache.catalina.startup.VersionLoggerListener - [main]   Java Home:             /opt/jdk1.8.0_201/jre
4588:2020-03-26T17:41:04,578 INFO  org.apache.catalina.startup.Catalina - [main]   Server startup in 49087 ms
4786:2020-03-26T17:48:18,043 INFO  org.apache.catalina.startup.VersionLoggerListener - [main]   Java Home:             /opt/jdk1.8.0_201/jre
4959:2020-03-26T17:49:04,625 INFO  org.apache.catalina.startup.Catalina - [main]   Server startup in 46323 ms
5396:2020-03-26T17:57:58,673 INFO  org.apache.catalina.startup.VersionLoggerListener - [main]   Java Home:             /opt/jdk1.8.0_201/jre
5569:2020-03-26T17:58:45,442 INFO  org.apache.catalina.startup.Catalina - [main]   Server startup in 46543 ms
6182:2020-03-26T18:13:39,914 INFO  org.apache.catalina.startup.VersionLoggerListener - [main]   Java Home:             /opt/jdk1.8.0_201/jre
6355:2020-03-26T18:14:27,238 INFO  org.apache.catalina.startup.Catalina - [main]   Server startup in 47073 ms
7096:2020-03-26T18:32:39,525 INFO  org.apache.catalina.startup.VersionLoggerListener - [main]   Java Home:             /opt/jdk1.8.0_201/jre
7266:2020-03-26T18:33:27,550 INFO  org.apache.catalina.startup.Catalina - [main]   Server startup in 47812 ms

Есть идеи, как отлаживать, почему это не работает, или я упустил что-то очевидное? Я выполнил множество конфигураций проб и ошибок (включая настройку Compositefilter, хотя даже с использованием одного Regexfilter не работает), а также включил отладку log4j2 (StatusLogger выглядит нормально), однако просто нет указаний на то, что не так или почему соответствующие строки не выводятся отдельно в сконфигурированный журнал приложений File.

Чтение документации (https://logging.apache.org/log4j/log4j-2.3/manual/filters.html) и исходного кода (https://github.com/apache/logging-log4j2/blob/master/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java), а также поиск примеров (https://duckduckgo.com/?q=log4j2+regexfilter+examples ) не помогло мне в дальнейших поисках.

1 Ответ

0 голосов
/ 27 марта 2020

Решение : регулярное выражение, похоже, неверно, удаление пробелов вокруг 'запуска' заставляет его работать.

        <RegexFilter regex=".*startup.*" onMatch="ACCEPT" onMismatch="DENY"/>

К сожалению, нет никакого здравого способа проверить, какое регулярное выражение правила применяются во время оценки. К счастью, теперь есть документированный пример для поиска другими.

...