【问题标题】:How to filter out Jetty DEBUG messages in slf4j/log4j2?如何过滤掉 slf4j/log4j2 中的 Jetty DEBUG 消息?
【发布时间】:2018-02-20 12:08:16
【问题描述】:

我刚刚在我的应用程序中添加了一个嵌入式 Jetty/Jersey 服务器,它使用带有 slf4j 绑定的 log4j2 日志记录提供程序。日志库位于类路径中,Jetty 使用它们,如下所述:

https://www.eclipse.org/jetty/documentation/9.4.x/configuring-logging.html

这是一件好事,只是 Jetty 中的DEBUG 级别非常嘈杂,正如那里所提到的。

我有三个不同级别的附加程序(一个控制台和两个文件),其中一个的文件名是通过编程方式配置的,除此之外,配置在log4j2.properties 文件中指定。所以设置有点复杂,但它正是我需要的。

是否有一种简单的方法可以在处理消息字符串之前将 Jetty 调试消息转换为跟踪和/或仅根据包名称完全过滤掉调试消息?

我不认为转换日志记录级别很容易或不可能,但问一下也无妨。

就过滤而言,换句话说,我想根据包指定不同的级别,INFO 用于org.eclipse.jetty 和子包以TRACE 作为默认值,或者TRACE 用于我的默认为 INFO 的包和子包。理想情况下,这应该在一个地方完成,但并非必须如此。

我对 loggers 和 appender 仍然有些困惑,所以我部分地通过反复试验来完成这项工作。例如,rootLogger.level 似乎没有任何影响,所以我猜我无法通过rootLogger 指定过滤器。我发现的一些参考资料建议创建一个名称与特定类匹配的记录器,但我不确定这将如何解决这个问题——它是否适用于包/子包级别的过滤,如果是这样,我是否需要创建多个记录器都可以写入相同的附加程序?

【问题讨论】:

    标签: logging log4j slf4j log4j2


    【解决方案1】:

    如何给 org.eclipse.jetty 一个记录器并设置为错误级别和 additivity=false,并将 appender 附加到控制台或其他日志,这样它就不会记录到根记录器来打扰您。

    <Appenders>        
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%-5p:[%c.class(%c{1}.java:%L)] %m%n"/>             
        </Console>                
    </Appenders>
    
    <Logger name="org.eclipse.jetty" level="error" additivity="false">            
        <AppenderRef ref="Console"/>
    </Logger>
    

    【讨论】:

    • 感谢您的建议!是否可以将不同记录器的输出合并到同一个文件附加器中?我还需要弄清楚如何将这种语法翻译成.properties
    • 是的,只需将 (logfile1 是 appender 名称)添加到不同的 logger,那么这些 logger 将使用相同的 appdender,如果是文件 appender,它将登录到同一个文件。
    【解决方案2】:

    我的临时解决方案是将 rootLogger.level 更改为 info,这会影响 Jetty (org.eclipse.jetty),但不会影响我的代码 (net.....)。我唯一拥有的其他记录器是一个文件记录器,它被命名为net,这似乎是它起作用的原因。奇怪的是,文件记录器也会影响我代码的控制台输出,这对我有用,但我不明白它为什么会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2015-03-28
      • 2021-05-21
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多