Маркер log4j2 и isEnabled

Я пытаюсь определить, существует ли регистратор для маркера в Log4j 2. Фильтр работает при фактической регистрации. Проблема при проверке isEnabled(уровень, маркер). Если фильтры MakerFilters находятся на уровне конфигурации, значит, он работает должным образом. Если на уровне логгера или аппендера, то он обходит маркер и учитывает только пороговый уровень.

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

Я пытаюсь выяснить, как настроить его на уровне Logger, чтобы Logger.isEnabled(Level,Marker) отвечал так же, как и при вызове Logger.log(Level,Marker,msg).
Есть ли способ настроить это или это ожидаемое поведение, что два метода отвечают по-разному?

Тесты выполняются с использованием: Log4j 2.0-rc1

Спасибо

TestLog2.java

Здесь операторы регистрации, которые проверяют каждый Маркер на предмет его включения. DB_OP является родительским маркером DB_DELETE и DB_QUERY.

private final static Logger log = LogManager.getLogger(TestLog2.class);
public int method2(String string, int i) {
    Level logLevel = Level.INFO;
    log.entry(string, i);
    int x = i + 2;

    System.out.printf("Level: %s is enabled: %s%n", logLevel, log.isEnabled(logLevel));
    // This should return false
    System.out.printf("Level: %s : DB_DELETE is enabled: %s%n", logLevel, log.isEnabled(logLevel, DbMarkers.DB_DELETE.getMarker()));
    System.out.printf("Level: %s : DB_QUERY is enabled: %s%n", logLevel, log.isEnabled(logLevel, DbMarkers.DB_QUERY.getMarker()));
    System.out.printf("Level: %s : DB_OP is enabled: %s%n", logLevel, log.isEnabled(logLevel, DbMarkers.DB_OP.getMarker()));

    log.log(logLevel, DbMarkers.DB_OP.getMarker(), "This is a parent db marker message");
    // This should not print 
    log.log(logLevel, DbMarkers.DB_DELETE.getMarker(), "This is a delete marker message");
    log.log(logLevel, DbMarkers.DB_QUERY.getMarker(), "This is a query marker message");

    log.exit(x);
    return x;
}

Log4j2 Config

Конфиг с маркерными фильтрами на уровне логгера. Установите, чтобы запретить DB_DELETE, но принять DB_OP (включая DB_QUERY)

<Configuration status="error" strict="true" name="XMLConfigTest"
    packages="org.apache.logging.log4j.test">
    <Appenders>
        <Appender type="Console" name="DB">
            <Layout type="PatternLayout"
                pattern="DB: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
        <Appender type="Console" name="STDOUT">
            <Layout type="PatternLayout" pattern="STDOUT: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
    </Appenders>

    <Loggers>
        <Logger name="net.dt.log.test2" level="info" additivity="false">
            <AppenderRef ref="DB" />
            <Filters>
                <Filter type="MarkerFilter" marker="DB_DELETE" onMatch="DENY" onMismatch="NEUTRAL" /> 
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
        </Logger>
        <Root level="info">
            <AppenderRef ref="STDOUT">
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="DENY" onMismatch="NEUTRAL" />
            </AppenderRef>
        </Root>
    </Loggers>

</Configuration>

Выход

isEnabled возвращает true для всех запросов Marker. Запись журнала DB_DELETE не записывается.

STDOUT: 15:00:13.655 [main] ERROR TestLog1.method1 An error in TestLog1 : Should see this  
Level: INFO is enabled: true
Level: INFO : DB_DELETE is enabled: true  <---- This should be false
Level: INFO : DB_QUERY is enabled: true
Level: INFO : DB_OP is enabled: true
DB: 15:00:13.659 [main] INFO  TestLog2.method2 This is a parent db marker message DB_OP 
--- DB_DELETE log entry would be here if it was configured to accept. 
DB: 15:00:13.660 [main] INFO  TestLog2.method2 This is a query marker message DB_QUERY[ DB_OP ] 

Log4j2 Config

Теперь с фильтром на уровне конфигурации

<Configuration status="error" strict="true" name="XMLConfigTest"
    packages="org.apache.logging.log4j.test">
    <Filters> 
        <Filter type="MarkerFilter" marker="DB_DELETE" onMatch="DENY" onMismatch="NEUTRAL" /> 
        <Filter type="MarkerFilter" marker="DB_OP" onMatch="ACCEPT" onMismatch="NEUTRAL" /> 
    </Filters> 
    <Appenders>
        <Appender type="Console" name="DB">
            <Layout type="PatternLayout"
                pattern="DB: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
        <Appender type="Console" name="STDOUT">
            <Layout type="PatternLayout" pattern="STDOUT: %d{HH:mm:ss.SSS} [%t] %-5level %C{1}.%M %m %marker %ex%n" />
        </Appender>
    </Appenders>

    <Loggers>
        <Logger name="net.dt.log.test2" level="info" additivity="false">
            <AppenderRef ref="DB" />
            <Filters>
                <Filter type="MarkerFilter" marker="DB_DELETE" onMatch="DENY" onMismatch="NEUTRAL" /> 
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
        </Logger>
        <Root level="info">
            <AppenderRef ref="STDOUT">
                <Filter type="MarkerFilter" marker="DB_OP" onMatch="DENY" onMismatch="NEUTRAL" />
            </AppenderRef>
        </Root>
    </Loggers>

Выход

Теперь isEnabled возвращает false для DB_DELETE, но true для других маркеров DB_OP.

STDOUT: 15:24:33.565 [main] ERROR TestLog1.method1 An error in TestLog1 : Should see this  
Level: INFO is enabled: true
Level: INFO : DB_DELETE is enabled: false  <----- Now it shows as false
Level: INFO : DB_QUERY is enabled: true
Level: INFO : DB_OP is enabled: true
DB: 15:24:33.570 [main] INFO  TestLog2.method2 This is a parent db marker message DB_OP 
DB: 15:24:33.570 [main] INFO  TestLog2.method2 This is a query marker message DB_QUERY[ DB_OP ] 

1 ответ

В настоящее время в списке рассылки log4j-Dev идет обсуждение маркеров. Ваш ввод и случай использования могут быть очень полезны для разработчиков. Не могли бы вы присоединиться к списку рассылки со своим вопросом? Или, возможно, поднять Jira с вашим примером конфигурации и кода.

Другие вопросы по тегам