Маркеры Log4j2 в Logback

Я хотел бы использовать log4jdbc-log4j2 для регистрации вызовов JDBC. Поставщики документации предоставляют информацию о том, как использовать его с маркерами Log4j2.

<logger name="log4jdbc.log4j2" level="info" additivity="false">
  <MarkerFilter marker="LOG4JDBC_OTHER" onMatch="DENY" onMismatch="NEUTRAL"/>
  <appender-ref ref="Console"/>
</logger>

Есть ли способ переписать приведенный выше код для работы с Logback?

ОБНОВЛЕНИЕ: я уже пытался поместить TurboFilter вне регистратора непосредственно в элементе конфигурации. Однако это не меняет вывод журнала.

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
    <Name>LOG4JDBC_LOGBACK_FILTER</Name>
    <Marker>LOG4JDBC_OTHER</Marker>
    <OnMatch>DENY</OnMatch>
</turboFilter>

4 ответа

Маркеры в log4j2 работают следующим образом:

package org.so.log4j2.test;

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;

public class Log4j2Test {
    public static void main(String[] args)
    {
        Logger logger = LogManager.getLogger("Test");
        Marker LOG4JDBC_OTHER = MarkerManager.getMarker("LOG4JDBC_OTHER");

        logger.info("Line to show.");
        logger.info(LOG4JDBC_OTHER, "Line to hide");
    }
}

С ниже log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <MarkerFilter marker="LOG4JDBC_OTHER" onMatch="DENY" onMismatch="NEUTRAL"/>
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="Test" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>

Выход:

12:37:22.416 [main] INFO  Test - Line to show.

Маркеры в Logback работают следующим образом:

package org.so.logback.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

public class LogbackTest {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("Test");
        Marker LOG4JDBC_OTHER = MarkerFactory.getMarker("LOG4JDBC_OTHER");
        logger.info("Line to show");
        logger.info(LOG4JDBC_OTHER, "Line to hide");
    }
}

С этим logback.xml

<?xml version="1.0" ?>
<configuration>
    <property name="log.folder" value="./log"/>
    <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        <Marker>LOG4JDBC_OTHER</Marker>
        <OnMatch>DENY</OnMatch>
        <OnMismatch>NEUTRAL</OnMismatch>
    </turboFilter>

  <appender class="ch.qos.logback.core.ConsoleAppender" name="CONSOLE">
    <encoder>
      <pattern>[%p] [%thread] %logger - %msg%n</pattern>
    </encoder>
  </appender>

  <root>
    <level value="INFO"/>
    <appender-ref ref="CONSOLE"/>
  </root>

  <logger name="Test" additivity="false">
    <level value="INFO" />
    <appender-ref ref="CONSOLE"/>
  </logger>     
</configuration>

Выход:

[INFO] [main] Test - Line to show

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

Ps может опять флаг аддитивности?..

Я пытался поставить log4jdbc.dump.sql.select=false в log4jdbc.log4j2.properties, и это отфильтровывает операторы выбора. Вы можете заменить "выбрать" другими ключевыми словами, такими как "создать", "обновить"...

Если вы хотите иметь больше контроля над ведением журнала, вы можете расширить Slf4jSpyLogDelegatorточка log4jdbc.spylogdelegator.name к вашему новому классу и переопределите методы по мере необходимости.

Это работает для меня в logback.xml. Он вообще не использует маркеры, но делает то, что мне нужно, т.е. фильтрует только SQL-операторы (с синхронизацией).

<logger name="jdbc.sqlonly" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.sqltiming" level="info" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.audit" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.resultset" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.resultsettable" level="info" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.connection" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>

Эти 6 регистраторов описаны в документации log4jdbc-log4j2.

Я считаю, что то, что вы ищете, называется TurboFilters в Logback. См. http://logback.qos.ch/manual/filters.html

Обновление: если я правильно понимаю ваш вопрос, у вас есть приложение, которое использует Log4j 2 API (или одна из его зависимостей). Вы хотите использовать Logback как реализацию logger. Теперь возникает вопрос, как перенаправить вызовы из API Log4j 2 в реализацию Logback, в идеале переводя маркеры Log4j 2 в маркеры SLF4J?

Возможно, все, что вам нужно сделать, это добавить адаптер Log4j в SLF4J (log4j-to-slf4j-2.x.jar).

Быть осторожен:

Никогда не следует пытаться использовать адаптер SLF4J (log4j-to-slf4j-2.x.jar) вместе с мостом SLF4J (log4j-slf4j-impl-2.x.jar), поскольку это приведет к бесконечной маршрутизации событий между SLF4J и Log4j 2.

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