繁体   English   中英

Logback中的Log4j2标记

[英]Log4j2 markers in 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>

我相信你要找的东西在Logback中被称为TurboFilters。 请参阅http://logback.qos.ch/manual/filters.html

更新:如果我正确理解您的问题,您有一个使用Log4j 2 API(或其中一个依赖项)的应用程序。 您希望使用Logback作为记录器实现。 现在,问题是,如何将来自Log4j 2 API的调用路由到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。

这在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>

log4jdbc-log4j2文档中描述了这6个记录器。

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.log4j2.properties中放入log4jdbc.dump.sql.select=false ,并过滤掉了select语句。 您可以将'select'替换为其他关键字,例如'create','update'......

如果你想对日志记录的更多控制,可以延长Slf4jSpyLogDelegator ,点log4jdbc.spylogdelegator.name根据需要为新的类和重写方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM