log4j2 как отфильтровать сообщения, не имеющие ключа ThreadContext - PullRequest
0 голосов
/ 06 февраля 2019

В моем приложении иногда у меня есть ключ threadContext 'jobId' при регистрации, иногда нет.

Поэтому я хочу передать сообщения журнала моему приложению jdbc log (для которого требуется поле 'jobId')если в threadContext присутствует ключ 'jobId'.

Я не могу управлять им для настройки DynamicThresholdFilter, чтобы пропустить сообщение журнала

<JDBC name="databaseAppender" tableName="LOG_MESSAGE">
        <DynamicThresholdFilter key="jobId" defaultThreshold="INFO" onMatch="ACCEPT" onMismatch="DENY">
        </DynamicThresholdFilter>
        <DataSource jndiName="java:jboss/datasources/myDS" />
        <Column name="MESSAGE" pattern="%message" />
        <Column name="Job_KEY_" pattern="%X{jobId}" />
    </JDBC>

1 Ответ

0 голосов
/ 09 февраля 2019

Для этого можно использовать RoutingAppender , аналогично примеру на странице часто задаваемых вопросов log4j2 .

Вот класс Java, который делает некоторые записи:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args){

        //These should appear in the console only
        log.debug("No jobId, This is some debug!");
        log.info("No jobId, Here's some info!");
        log.error("No jobId, Some error happened!");

        //These should route to a simulated JDBC appender only
        ThreadContext.put("jobId", "1234");
        log.debug("With jobId, This is some debug!");
        log.info("With jobId, Here's some info!");
        log.error("With jobId, Some error happened!");

        //Once again these will go to console only
        ThreadContext.remove("jobId");
        log.debug("No jobId, This is some debug!");
        log.info("No jobId, Here's some info!");
        log.error("No jobId, Some error happened!");
    }
}

Вот пример файла конфигурации log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <File name="simulatedJdbc" fileName="logs/simulatedJdbc.txt"
            immediateFlush="false" append="true">
            <PatternLayout
                pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %X{jobId} - %msg%n" />
        </File>


        <Routing name="Routing">
            <Routes pattern="$${ctx:jobId}">
                <!-- This route is chosen if ThreadContext has no value for key jobId. -->
                <Route key="$${ctx:jobId}" ref="Console" />
                <!-- This is the default route when no others match -->
                <Route ref = "simulatedJdbc"/>              
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Routing" />
        </Root>
    </Loggers>
</Configuration>

Результатом выполнения вышеупомянутого являетсяследующий вывод:

Консольный вывод:

17:49:41.659 [main] DEBUG example.SomeClass - No jobId, This is some debug!
17:49:41.663 [main] INFO  example.SomeClass - No jobId, Here's some info!
17:49:41.664 [main] ERROR example.SomeClass - No jobId, Some error happened!
17:49:41.664 [main] DEBUG example.SomeClass - No jobId, This is some debug!
17:49:41.664 [main] INFO  example.SomeClass - No jobId, Here's some info!
17:49:41.664 [main] ERROR example.SomeClass - No jobId, Some error happened!

simulatedJdbc.txt вывод:

2019-02-08 17:49:41.664 [main] DEBUG example.SomeClass 1234 - With jobId, This is some debug!
2019-02-08 17:49:41.664 [main] INFO  example.SomeClass 1234 - With jobId, Here's some info!
2019-02-08 17:49:41.664 [main] ERROR example.SomeClass 1234 - With jobId, Some error happened!

Как вы можетеПосмотрите, когда ThreadContext содержит jobId, журналы направляются на имитированный JDBC-аппендер (в моем примере это просто файловый аппендер).Когда jobId отсутствует, журналы направляются в консольный аппендер вместо этого.

Надеюсь, это поможет!

...