2016-05-07 4 views
1

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

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

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

UPDATE: Я уже пытался установить TurboFilter вне регистратора непосредственно внутри элемента конфигурации. Однако он не изменяет выход журнала.

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

ответ

0

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

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

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

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

Использование адаптера SLF4J (log4j к SLF4J-2.x.jar) вместе с SLF4J мост (log4j-SLF4J-осущ-2.x.jar) никогда не следует пытаться, как это приведет к событиям конца прокладываться между SLF4J и Log4j 2.

+0

Спасибо за быстрый ответ. Я уже пробовал это, прежде чем публиковать свой вопрос, и это не сработало для меня. Я обновил свой вопрос. Я не уверен, могу ли я просто использовать имя маркера log4j2, которое использует библиотека. – devmake

+0

Ваше понимание верное. Зависимость '' 'log4jdbc-log4j2''' использует API Log4j 2 и я использую' '' spring-boot-starter''' с '' 'logback'''. Я попытался добавить зависимость от '' 'org.apache.logging.log4j: log4j-to-slf4j: 2.5''', но он ничего не фильтрует, я все еще вижу все сообщения в консоли. – devmake

+0

Это странно. Глядя на код, log4j-to-slf4j пытается преобразовать маркеры: http://logging.apache.org/log4j/2.x/log4j-to-slf4j/xref/org/apache/logging/slf4j/SLF4JLogger .html # L92 –

0

Это работает для меня в 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 documentation.

0

Маркеры в 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 

Надеется, что это помогает.

P.s. возможно аддитивность флаг снова? ..

+0

Я могу получить пример с моим собственным '' 'MarkerFactory.getMarker''', работающим так же, как у вас в # 2. Однако он не работает с log4jdbc-log4j2, потому что он использует org.apache.logging.log4j.Logger (пример # 1), и я использую logback.xml (пример # 2). – devmake

+0

Что вы хотите достичь в конце? Один файл конфигурации XML, объединяющий настройки - logback и log4jdbc-log4j2? –

+0

Я пытаюсь настроить это с помощью одного файла конфигурации xml, но не против количества файлов. Я хочу вывод на консоль и один файл для моего приложения и библиотеки. – devmake

0

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

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