8

我在 Spring 中学习 Slf4j 和 log4j。我已经看到我们在使用一行的地方

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

我已经看到默认情况下这是获取根记录器。

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

2 回答 2

24

我已经看到默认情况下这是获取根记录器

不它不是。

假设 FQNNamefoo.bar.Name),当您调用 时private final Logger logger = LoggerFactory.getLogger(Name.class);,您将得到一个名称foo.bar.Name为 的记录器,它继承自foo.bar,继承自foo,继承自根。

您可以通过以下方式获取 SLF4J 中的根记录器LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

记录器是分层的。子级别记录器从其父级(包括附加程序、级别等)继承配置。我相信您对“获取从 ROOT 记录器继承配置的子记录器”和“获取 ROOT 记录器”感到困惑

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);. 这使它对重构更加友好。在这种情况下,获取的记录器名称将与提供的类的 FQN 相同(“com.example.foo.Bar”)

于 2013-09-02T04:05:03.260 回答
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/商店/产品/log4j手册

于 2013-09-01T19:29:11.263 回答