2013-09-01 37 views
5

我学习SLF4J和Spring.I log4j的得到比根记录等从SLF4J看到我们使用一个线如何使用Log4J的

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

我已经看到,这是获得根记录由eyerywhere默认。

  1. 这是如何得到根记录器?我错了吗?

  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> 

回答

19

我已经看到了,这是在默认情况下得到根记录

不,它不是。

当你打电话private final Logger logger = LoggerFactory.getLogger(Name.class);和承担Name FQN为foo.bar.Name,那么你正在使用的名称foo.bar.Name一个记录器,用于从foo.bar继承,用于从foo继承,用于从根继承。

得到根记录在SLF4J的方式是通过LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

你需要知道的是,记录器是在层次结构。子级记录器继承父级配置(包括appender,level等)。我相信你已经混了的“让这继承配置从根记录孩子记录器”和“获取ROOT记录器”

我2.How可以得到它们在的log4j.xml文件中定义的其他记录器的想法?

比如,你正在试图让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相同

+0

“,这使得它更易于重构,在这种情况下,记录器名称将与提供的类的FQN相同(本例中为“com.example.foo.Bar”)“。我没有得到最后一行.. – beinghuman

+0

我的意思是,如果Foo的Foo '是'com.example.foo.Bar',然后当你通过'... getLogger(Bar.class)'(哦,在我原来的答案错字,将解决该问题)记录器,返回的记录器的名称将是“com.example.foo.Bar”。对于“重构友好”语句:将FQN作为字符串传递给Class对象以获取记录器的一个区别是,如果重命名类或包,则在后一种情况下仍然会得到正确的记录器。 –

+0

这帮了我一大堆,非常感谢这个详细的答案。 +1 – WillBD

1

1.How这个越来越根记录

记录器建立一个层次,你可以从这里看到表:http://logging.apache.org/log4j/2.x/manual/architecture.html

2.如何使用c我得到其他记录器是在log4j.xml文件中定义的?

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

而且,我还没有发现任何slf4J.If好的教程,你有一些很好的联系

SLF4J有相当多的文档:http://www.slf4j.org/docs.html但由于它只是一个包装, log4j的不“工作”所以这里有一本关于它:http://www.qos.ch/shop/products/log4jManual