【问题标题】:Overwrite java.util.logging.Logger.isLoggable() used by third party library?覆盖第三方库使用的 java.util.logging.Logger.isLoggable()?
【发布时间】:2019-07-12 21:40:57
【问题描述】:

我正在开发的应用程序提供基于当前用户的日志记录。为此,我使用 log4j AbstractFilter 检查当前用户是否有自定义日志级别,并为 Log.isDebugEnabled() 等方法返回适当的结果。

我的应用程序使用的一些第三方库使用java.util.logging。我希望以与我自己的日志记录相同的方式记录这些日志。但是java.util.logging.Logger.isLoggable() 方法返回的结果与我自己的日志记录不同。有没有办法用我自己的逻辑覆盖这个函数?

编辑:我在我的应用程序中使用slf4j,并使用log4j2 作为底层日志记录框架。我尝试使用 java.util.logging ~> slf4j 桥,如here 所述,但它似乎只影响Log 函数本身,而不影响isLoggable()

【问题讨论】:

    标签: logging log4j log4j2 slf4j java.util.logging


    【解决方案1】:

    在 java.util.logging 中,您可以通过实现 java.util.logging.Filter 并设置适当的 level 来修改 isLoggable 行为。

    SLF4JBridgeHandler 的源代码看来,发布方法没有在处理程序上调用isLoggable。因此,您不能简单地将 java.util.logging.Filter 安装到 SLF4JBridgeHandler。

    一种选择是将 SLF4JBridgeHandler 包装在代理处理程序中,例如 MemoryHandler。这可以在 logging.properties 文件中或通过代码进行设置:

    MemoryHandler h = new MemoryHandler(new SLF4JBridgeHandler(), 1, Level.ALL);
    h.setLevel(Level.ALL);
    h.setFilter(new CurrentUserFilter()); //Your custom code.
    java.util.logging.Logger.getLogger("").addHandler(h); //Install the bridge manually.
    

    另一种选择是在所有记录器上安装 log4 过滤器。如果所有记录器都基于类名而不是子系统,那可能需要做很多工作。

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 2014-03-07
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多