我正在Spring学习Slf4j和log4j。我已经看到了我们正在使用一行的eyery
private final Logger logger = LoggerFactory.getLogger(name.class);
我已经看到默认情况下这是一个root logger。
这是如何获得root logger的?我错了吗?
如何获取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>
答案 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