【问题标题】:Filtering out log4j messages from third-party frameworks?从第三方框架中过滤掉 log4j 消息?
【发布时间】:2010-08-25 19:13:11
【问题描述】:

如何过滤来自外部第三方框架的日志消息?我正在使用 Hibernate 和 Spring 框架,我想抑制日志,以便只显示我的 log4j 日志。

【问题讨论】:

    标签: java hibernate spring log4j


    【解决方案1】:

    在我的 log4j.properties 文件中,我将根 logger 日志记录级别设置为 ERROR。然后对于我特别想记录的包,比如我的应用程序代码,我将记录级别设置为 INFO 或 DEBUG。

    log4j.rootLogger=ERROR, stdout
    log4j.logger.com.initech.tps=DEBUG
    log4j.logger.org.hibernate.SQL=INFO
    

    我看到同事将 root 日志设置为低,然后最终列出他们不想看到的所有内容,这对我来说似乎倒退了。我宁愿列出我想要记录的内容,也不愿列出我不想记录的所有内容。

    顺便说一句,完全关闭第三方组件的注销对我来说似乎是个坏主意。例如,Spring 相对嘈杂,并且对我真的不需要知道的事情使用 WARN,但如果它为我想看到的事情记录一个 ERROR 条目。

    【讨论】:

      【解决方案2】:

      您可以通过更改 log4j.properties/log4j.xml 文件中的记录器级别来实现。

      如果您想从包中过滤日志但保留记录器配置以供以后使用,则需要设置记录器的<level value="off"/>。 您还可以将其设置为最高级别以仅在出现错误或致命问题时进行记录。

      应将以下条目添加到 log4j.xml 以关闭来自 hibernate 和 springframework 包的日志记录:

      <logger name="org.springframework">
          <level value="off"/>
      </logger>
      <logger name="org.hibernate">
          <level value="off"/>
      </logger>
      

      【讨论】:

      • 因此可以为父包设置级别关闭,就像在这种情况下,如果我不希望所有以 org.springframework 开头的包的日志,我会将其级别设置为关闭。
      【解决方案3】:

      在 log4j.properties 中,您可以基于每个记录器定义单独的级别:

      log4j.logger.<name>=FATAL
      

      在 log4j.xml 中的语法是

      <logger name="<name>">
        <level value="fatal"/> 
      </logger>
      

      通常是完全限定的类名。您可能想使用 WARN 或 ERROR 而不是 FATAL

      【讨论】:

        【解决方案4】:

        只是不要在您的 log4j.properties 中添加这些包。例如,您的属性文件中必须包含 Spring 的 this。如果您有以下条目(任何以 org.springframework 开头的条目),请将其取出。休眠也需要这样做。

        #Logs the SQL from Spring
        log4j.logger.org.springframework.jdbc.core.JdbcTemplate=ERROR
        #Logs the SQL parameters from Spring
        log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=ERROR
        

        正如前面提到的,您还应该设置以下内容。我忘了提这个。

        log4j.rootLogger=FATAL  
        or   
        log4j.rootLogger=ERROR  
        

        【讨论】:

        • 情况正好相反。根记录器通常会启用所有内容,然后您需要关闭不需要的内容。因此 =ERROR 所以较低级别的所有内容都不会显示。
        • @Thorbjørn Ravn Andersen:请阅读我所说的。如果他有任何这些条目,我告诉 OP 将它们取出,因为他不想看到这些包裹中的任何消息。
        • 将类似的行放入,将阻止记录这些包的调试或信息消息,即使为 rootLogger 定义了调试/信息。
        • 好吧,你是说如果我有 log4j.rootLogger=FATAL 并且我的 log4j.properties 中没有列出任何 spring 包,它仍然会显示来自 spring 的消息吗?只是确保我说清楚。
        猜你喜欢
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 2021-05-21
        • 2023-03-20
        • 2017-02-23
        • 2013-10-20
        • 1970-01-01
        相关资源
        最近更新 更多