简体   繁体   English

Logback中的Log4j2标记

[英]Log4j2 markers in Logback

I'd like to use log4jdbc-log4j2 to log JDBC calls. 我想使用log4jdbc-log4j2来记录JDBC调用。 The documentation providers information how to use it with Log4j2 markers. 文档提供程序有关如何将其与Log4j2标记一起使用的信息。

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

Is there any way how to rewrite the above code to work with Logback? 有没有办法如何重写上面的代码来使用Logback?

UPDATE : I already tried to put a TurboFilter outside the logger directly inside the configuration element. 更新 :我已经尝试将TurboFilter直接放在记录器外部的配置元素中。 It however doesn't change the log output. 但是它不会更改日志输出。

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

I believe what you are looking for is called TurboFilters in Logback. 我相信你要找的东西在Logback中被称为TurboFilters。 See http://logback.qos.ch/manual/filters.html 请参阅http://logback.qos.ch/manual/filters.html

Update: if I understand your question correctly, you have an application that uses the Log4j 2 API (or one of its dependencies does). 更新:如果我正确理解您的问题,您有一个使用Log4j 2 API(或其中一个依赖项)的应用程序。 You want to use Logback as the logger implementation. 您希望使用Logback作为记录器实现。 Now, the question is, how to route calls from the Log4j 2 API to the Logback implementation, ideally translating Log4j 2 Markers into SLF4J Markers? 现在,问题是,如何将来自Log4j 2 API的调用路由到Logback实现,理想情况下将Log4j 2标记转换为SLF4J标记?

Perhaps all you need to do is add the Log4j to SLF4J adapter (log4j-to-slf4j-2.x.jar). 也许您需要做的就是将Log4j添加到SLF4J适配器 (log4j-to-slf4j-2.x.jar)。

Be careful: 小心:

Use of the SLF4J adapter (log4j-to-slf4j-2.x.jar) together with the SLF4J bridge (log4j-slf4j-impl-2.x.jar) should never be attempted as it will cause events to endlessly be routed between SLF4J and Log4j 2. 不应尝试使用SLF4J适配器(log4j-to-slf4j-2.x.jar)和SLF4J桥(log4j-slf4j-impl-2.x.jar),因为它会导致事件无休止地在两者之间路由SLF4J和Log4j 2。

This works for me in logback.xml. 这在logback.xml中适用于我。 This doesn't use markers at all but does what I need ie filters only sql statements (with timing). 这根本不使用标记,而是做我需要的东西,即仅过滤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>

These 6 loggers are described in log4jdbc-log4j2 documentation . log4jdbc-log4j2文档中描述了这6个记录器。

Markers in log4j2 work this way: 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");
    }
}

With below log4j2.xml: 使用下面的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>

Output: 输出:

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

Markers in Logback work this way: 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");
    }
}

With this logback.xml 使用此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>

Output: 输出:

[INFO] [main] Test - Line to show

Hope it helps. 希望能帮助到你。

Ps maybe additivity flag again?.. Ps可能再次加成标志?

I tried to put log4jdbc.dump.sql.select=false in log4jdbc.log4j2.properties, and it filtered out select statements. 我试图在log4jdbc.log4j2.properties中放入log4jdbc.dump.sql.select=false ,并过滤掉了select语句。 You can replace 'select' with other key words like 'create', 'update'... 您可以将'select'替换为其他关键字,例如'create','update'......

If you want to have more control on the logging, you can extend Slf4jSpyLogDelegator , point log4jdbc.spylogdelegator.name to your new class and override methods as needed. 如果你想对日志记录的更多控制,可以延长Slf4jSpyLogDelegator ,点log4jdbc.spylogdelegator.name根据需要为新的类和重写方法。

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

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