我正在使用的应用程序提供基于当前用户的日志记录。为此,我使用log4j AbstractFilter
来检查当前用户是否存在自定义日志级别,并为Log.isDebugEnabled()
等方法返回适当的结果。
我的应用程序使用的某些第三方库使用java.util.logging
。我希望这些日志与我自己的日志记录一样。但是java.util.logging.Logger.isLoggable()
方法返回的结果与我自己的日志记录不同。有什么方法可以用我自己的逻辑覆盖此功能?
编辑:我在应用程序中使用slf4j
作为基础日志框架的log4j2
。我尝试使用here中所述的java.util.logging〜> slf4j桥,但它似乎只会影响Log
函数本身,而不会影响isLoggable()
。
答案 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过滤器。如果所有记录器均基于类名而不是子系统,则可能会花费很多工作。