如何使用Log4J从SLF4J获取除root记录器以外的其他记录器

bei*_*man 5 java slf4j log4

我在Spring学习Slf4j和log4j.我已经看到了我们使用一行的eyery

private final Logger logger = LoggerFactory.getLogger(name.class);
Run Code Online (Sandbox Code Playgroud)

我已经看到这是默认情况下获取root logger.

  1. 如何获得root logger?我错了吗?

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

这是我的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
    debug="false">

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c{2}: %m%n" />
        </layout>
    </appender>

    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </appender>

    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">

        <param name="File" value="C:/log/spring-hib.log" />
        <param name="MaxBackupIndex" value="100" />

        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c{2}: %m%n" />
        </layout>


    </appender>

  <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>



    <category name="org.hibernate">
        <priority value="DEBUG" />
    </category>

    <category name="java.sql">
        <priority value="debug" />
    </category>

    <root>
        <priority value="INFO" />
        <appender-ref ref="ASYNC" />
    </root>

</log4j:configuration>
Run Code Online (Sandbox Code Playgroud)

Adr*_*hum 21

我已经看到这是默认情况下获取root logger

不它不是.

当您调用private final Logger logger = LoggerFactory.getLogger(Name.class);并假设FQN为Nameis时foo.bar.Name,您将获得一个带有名称的记录器foo.bar.Name,其继承自foo.bar,从foo哪个继承自root用户.

在SLF4J中获取根记录器的方法是 LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

您需要知道的是,记录器处于层次结构中.子级记录器从父级继承配置(包括appenders,级别等).我相信你已经混淆了"从ROOT logger继承配置的子记录器"和"获取ROOT记录器"的想法

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

例如,你试图获得com.example.foo,它只是由private final Logger logger = LoggerFactory.getLogger("com.example.foo");

如上所述,记录器是分层的.如果你得到logger"com.example.foo.Bar",假设你没有给"com.example.foo.Bar"特定的设置,它的行为应该与使用"com.example.foo"相同(除了日志中显示的记录器名称外.

由于通常使用类名本身作为记录器名称,因此SLF4J还提供了一种通过提供类来获取记录器的方法(就像您在问题中所做的那样),这样您就可以做到Logger logger = LoggerFactory.getLogger(Bar.class);,这使得它更多重构友好.在这种情况下,记录器名称get将与提供的类的FQN相同(在本例中为"com.example.foo.Bar")