【问题标题】:Log4j2 markers in LogbackLogback 中的 Log4j2 标记
【发布时间】:2016-05-07 08:36:51
【问题描述】:

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

【问题讨论】:

    标签: java logging logback log4j2 log4jdbc


    【解决方案1】:

    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
    

    希望对你有帮助。

    附:也许 additivity 再次标记?..

    【讨论】:

    • 我可以使用我自己的MarkerFactory.getMarker 获得一个示例,就像您在#2 中一样。但是它不适用于 log4jdbc-log4j2,因为它使用 org.apache.logging.log4j.Logger(示例 #1)而我使用 logback.xml(示例 #2)。
    • 你到底想达到什么目的?结合 -- logback 和 log4jdbc-log4j2 设置的单个 XML 配置文件?
    • 我正在尝试使用单个 xml 配置文件进行配置,但不要介意文件数量。我希望输出到控制台,并为我的应用程序和库提供一个文件。
    • 你能把 log4jdbc 换成 slf4j 吗?引用项目:“这个项目的名称有点误导,因为它还支持 SLF4J,它隐式支持每个主要的日志框架。”
    • 我可以根据我的answer 中描述的 slf4j 进行日志记录工作。我就是无法让它与标记一起使用。
    【解决方案2】:

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

    如果您想对日志记录进行更多控制,您可以扩展Slf4jSpyLogDelegator,将log4jdbc.spylogdelegator.name 指向您的新类并根据需要覆盖方法。

    【讨论】:

      【解决方案3】:

      这在 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 documentation 中描述了这 6 个记录器。

      【讨论】:

        【解决方案4】:

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

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

        也许您需要做的就是添加Log4j to SLF4J adapter (log4j-to-slf4j-2.x.jar)。

        小心:

        将 SLF4J 适配器 (log4j-to-slf4j-2.x.jar) 与 SLF4J 桥(log4j-slf4j-impl-2.x.jar)不应该被尝试为 它将导致事件在 SLF4J 和 Log4j 2 之间无休止地路由。

        【讨论】:

        • 感谢您的及时答复。在发布我的问题之前我已经尝试过了,但它对我不起作用。我已经更新了我的问题。我不确定是否可以简单地使用库使用的 log4j2 标记名称。
        • 你的理解是正确的。依赖 log4jdbc-log4j2 使用 Log4j 2 API,我使用 spring-boot-starterlogback。我尝试将依赖项添加到org.apache.logging.log4j:log4j-to-slf4j:2.5,但它没有过滤任何内容,我仍然在控制台中看到所有消息。
        • 这很奇怪。查看代码,log4j-to-slf4j 确实尝试转换标记:logging.apache.org/log4j/2.x/log4j-to-slf4j/xref/org/apache/…
        • 也许您仍然在控制台中看到 log4j2 输出,因为 log4j2 实现 jar(log4j-core)仍在类路径中? (只需要log4j-api和log4j-to-slf4j)
        • 我在依赖项中没有 log4j-core。我有logback-corelogback-classic。 Spring Boot 按照您的建议添加了org.slf4j:log4j-over-slf4j:1.7.16```` which redirects log4j calls to slf4j. I also added org.slf4j:log4j-over-slf4j:2.5```。除此之外,我还看到以下依赖项org.apache.logging.log4j:log4j-api:2.4.1org.slf4j:jcl-over-slf4j:1.7.16org.slf4j:jul-to-slf4j:1.7.16org.slf4j:slf4j-api:1.7.16
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 1970-01-01
        • 2018-03-06
        • 2021-05-14
        • 1970-01-01
        • 2018-09-10
        • 2012-12-21
        相关资源
        最近更新 更多