【问题标题】:How to get other than root logger from SLF4J using Log4J如何使用 Log4J 从 SLF4J 获取除根记录器之外的其他记录器
【发布时间】:2013-09-01 19:12:28
【问题描述】:

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

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

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

  1. 这是如何获取 root 记录器的?我错了吗?

  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>

【问题讨论】:

    标签: java slf4j log4j


    【解决方案1】:

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

    不,不是。

    假设Name的FQN是foo.bar.Name),当你调用private final Logger logger = LoggerFactory.getLogger(Name.class);时,你会得到一个名为foo.bar.Name的记录器,它继承自foo.bar,它继承自foo,对于从根继承。

    您可以通过LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)获取SLF4J中的root logger

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

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

    比如要获取loggercom.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”)

    【讨论】:

    • "这使它对重构更加友好。在这种情况下,获取的记录器名称将与提供的类的 FQN 相同(在这种情况下为“com.example.foo.Bar”) " .我没有得到最后一行..
    • 我的意思是,如果 Foo 的 FQN 是 com.example.foo.Bar,那么当您通过 ...getLogger(Bar.class) 获取记录器时(哦,我原来的答案中的错字,会解决这个问题),返回的记录器将是“com.example.foo.Bar”。对于“重构友好”的声明:将 FQN 作为字符串与作为 Class 对象传递来获取记录器的一个区别是,如果类或包被重命名,您仍然会在后一种情况下获得正确的记录器。
    • 这对我有很大帮助,非常感谢这个详细的答案。 +1
    【解决方案2】:

    1.这是如何获取root logger的

    Loggers 构建一个层次结构,您可以从这里的表中看到: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

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 2021-10-27
      • 1970-01-01
      • 2018-07-10
      • 2019-01-14
      • 1970-01-01
      相关资源
      最近更新 更多