所以我有一个正确的实现,它被很好地调用了,但是没有方法LoggerFactory#getContext(String name) ..so,如果我不能传递任何依据来进行决策,那么如何做出决策呢?

有一个ContextSelector#getLoggerContext(String name),但我没有访问权限?

所以我的意思是:当我无法将东西传递到选择器中或无法对选择器进行任何访问时,如何进行“选择”?

我需要在运行时根据自己的逻辑从多个上下文中(显然会加载不同的配置)。

我找到了一种解决方案,可以简单地创建LoggerContexts并对其进行配置,但那时我不理解这种替代机制的意义。

最佳答案

ContextSelector是一个Logback构造,不是Slf4j API的一部分。因此,您在LoggerFactory上找不到任何与上下文相关的方法


但是没有方法LoggerFactory#getContext(String name)..so,如果我不能在其中传递决策依据,该如何决策


上下文是根据某些线程本地信息确定的。看一下ContextJNDISelector,它基于JNDI确定正确的上下文。现在,当在作为Web应用程序一部分的servlet中调用LoggerFactory.getLogger并启用JNDI ContextSelector时,Logback将确定线程的JNDI扩展,并根据该LoggerContext名称来确定。除了某些本地线程外,我看不到LoggerFactory可以确定上下文的方法。


我找到了一种解决方案,可以简单地创建LoggerContexts并对其进行配置,但那时我不理解这种替代机制的意义。


如果您的上下文选择逻辑可以在您的应用程序的入门级工作(例如,对于webapp,则为servlet过滤器),那么您可以拥有一个自定义的ContextSelector,它从ThreadLocal中查找,并让过滤器在该threadlocal中设置正确的上下文

关于java - Logback的自定义上下文选择器有什么意义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23088466/

10-14 12:28
查看更多