Java 如何使用Log4J从SLF4J获取非根记录器

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文件中定义的其他记录器 如果您想要

我在春季学习Slf4j和log4j。我已经在Eyerry看到了我们使用一条线的地方

private final Logger logger = LoggerFactory.getLogger(name.class);
我已经看到默认情况下这是根记录器

  • 这是怎么得到根记录器的?我错了吗

  • 如何获取log4j.xml文件中定义的其他记录器

  • 这是我的配置:

    
    
    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文件中定义的其他记录器

    例如,如果您想获取logger
    com.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.