2

我想使用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

4 回答 4

2

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也许又是加法标志?

于 2016-05-07T11:40:02.697 回答
1

我试图log4jdbc.dump.sql.select=false输入 log4jdbc.log4j2.properties,它过滤掉了 select 语句。您可以将“选择”替换为“创建”、“更新”等其他关键字...

如果你想对日志有更多的控制,你可以根据需要扩展Slf4jSpyLogDelegator、指向log4jdbc.spylogdelegator.name你的新类和覆盖方法。

于 2016-09-30T18:43:02.913 回答
0

我相信您正在寻找的是 Logback 中的 TurboFilters。见http://logback.qos.ch/manual/filters.html

更新:如果我正确理解您的问题,您有一个使用 Log4j 2 API(或其依赖项之一)的应用程序。您想使用 Logback 作为记录器实现。现在,问题是,如何将调用从 Log4j 2 API 路由到 Logback 实现,理想情况下将 Log4j 2 Markers 转换为 SLF4J Markers?

也许您需要做的就是将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。

于 2016-05-07T09:15:02.950 回答
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 文档中进行了描述。

于 2016-05-07T10:44:58.123 回答