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

时间:2013-09-01 19:12:29

标签: java slf4j log4

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

private final Logger logger = LoggerFactory.getLogger(name.class);

我已经看到默认情况下这是一个root logger。

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

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

  3. 这是我的配置:

    <?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>
    

2 个答案:

答案 0 :(得分:20)

  

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

不,不是。

当您致电private final Logger logger = LoggerFactory.getLogger(Name.class);并假设Name的FQN为foo.bar.Name时,您将获得一个名为foo.bar.Name的记录器,其继承自foo.bar ,继承自foo,继承自root。

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

您需要知道的是,记录器处于层次结构中。子级记录器从父级继承配置(包括appenders,级别等)。我相信你已经混淆了“从ROOT记录器继承配置的子记录器”和“获取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还提供了一种通过提供类来获取记录器的方法(就像您在问题中所做的那样),以便您可以{{{ 1}},这使它更加重构友好。在这种情况下,记录器名称get将与提供的类的FQN相同(在本例中为“com.example.foo.Bar”)

答案 1 :(得分:1)

  

1.如何获得root logger

记录器构建层次结构,您可以从这里的表中看到:http://logging.apache.org/log4j/2.x/manual/architecture.html

  

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

如果你想严格要求在那里定义,那么你必须解析并读取该配置文件。 如果您需要所有活动记录器及其在运行时的配置,那么它的API就是它。例如。一篇文章如何做到:http://nelz.net/2008/04/08/log4j-runtime-configuration/

  

另外,我还没有找到关于slf4J的任何好教程。如果你有一些很好的链接

slf4j有很多文档:http://www.slf4j.org/docs.html但是因为它只是一个包装器, log4j执行“工作”所以这里有一本关于它的书:http://www.qos.ch/shop/products/log4jManual