Java 如何使用Log4J从SLF4J获取非根记录器
我在春季学习Slf4j和log4j。我已经在Eyerry看到了我们使用一条线的地方Java 如何使用Log4J从SLF4J获取非根记录器,java,slf4j,log4j,Java,Slf4j,Log4j,我在春季学习Slf4j和log4j。我已经在Eyerry看到了我们使用一条线的地方 private final Logger logger = LoggerFactory.getLogger(name.class); 我已经看到默认情况下这是根记录器 这是怎么得到根记录器的?我错了吗 如何获取log4j.xml文件中定义的其他记录器 这是我的配置: 1.这是如何得到根记录器的 记录器构建了一个层次结构,从这里的表中可以看到: 2.如何获取log4j.xml文件中定义的其他记录器 如果您想要
private final Logger logger = LoggerFactory.getLogger(name.class);
我已经看到默认情况下这是根记录器
1.这是如何得到根记录器的
记录器构建了一个层次结构,从这里的表中可以看到:
2.如何获取log4j.xml文件中定义的其他记录器
如果您想要严格遵守那里的定义,那么您必须解析并读取该配置文件。
如果您在运行时需要所有活动记录器及其配置,那么就有了相应的API。例如,一篇文章如何做到这一点:
另外,我还没有找到任何关于slf4J的好教程。如果你有一些好的链接
slf4j有很多文档:但由于它只是一个包装器,
log4j完成了“工作”,所以这里有一本关于它的书:
我已经看到默认情况下这是根记录器
不,不是
当调用private final Logger Logger=LoggerFactory.getLogger(Name.class)时,假设Name
的FQN为foo.bar.Name
,您将获得一个名为foo.bar.name
的记录器,其继承自foo.bar
,其继承自foo
,其继承自root
您可以通过LoggerFactory.getLogger(logger.root\u logger\u NAME)
伐木工人是分层的。子级记录器从其父级继承配置(包括附加器、级别等)。我相信您对“获取从根记录器继承配置的子记录器”和“获取根记录器”感到困惑
2.如何获取log4j.xml文件中定义的其他记录器
例如,如果您想获取loggercom.example.foo
,只需通过private final logger logger=LoggerFactory.getLogger(“com.example.foo”)代码>
如上所述,记录器是分层的。如果您得到记录器“com.example.foo.Bar”,鉴于“com.example.foo.Bar”没有特定设置,其行为应该与使用“com.example.foo”相同(当然,日志中显示的记录器名称除外)
由于使用类名本身作为记录器名称是一种常见做法,因此SLF4J还提供了一种获取记录器的方法,方法是通过logger logger=LoggerFactory.getLogger(Bar.class)提供一个类(如您在问题中所做的)代码>。这使得它对重构更加友好。在本例中,获取的记录器名称将与提供的类(“com.example.foo.Bar”)“的FQN相同,这使得它更易于重构。在本例中,获取的记录器名称将与提供的类(“com.example.foo.Bar”在本例中)的FQN相同。我没有得到最后一行。我的意思是,如果Foo
的FQN是com.example.Foo.Bar
,那么当您通过…getLogger(Bar.class)
获取logger时(在我的原始答案中键入的Oh将修复该问题),返回的logger的名称将是“com.example.Foo.Bar”。对于“重构友好”的声明:将FQN作为字符串传递与作为类对象传递以获取记录器的一个区别是,如果重命名了类或包,在后一种情况下,您仍然可以获得正确的记录器。这对我帮助很大,非常感谢您给出了详细的答案+1.