覆盖第三方库使用的java.util.logging.Logger.isLoggable()?

时间:2019-02-19 11:32:38

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

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

我的应用程序使用的某些第三方库使用java.util.logging。我希望这些日志与我自己的日志记录一样。但是java.util.logging.Logger.isLoggable()方法返回的结果与我自己的日志记录不同。有什么方法可以用我自己的逻辑覆盖此功能?

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

1 个答案:

答案 0 :(得分:0)

在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过滤器。如果所有记录器均基于类名而不是子系统,则可能会花费很多工作。