• log4j 2 入门实例(3)


     

    继承机制

    • 所有logger都继承自root logger。
    • 可以认为名为log4j2learn.Hello的logger继承自名为log4j2learn的logger。
    • log4j会先查找名称是"log4j2learn.Hello"的logger,如果没有找到,向上查找名称是"log4j2learn"的logger,如果还没有找到那么继续向上查找,查找的最顶层就是rootLogger。

    log4j2.xml文件配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration status="OFF">
        <appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </appenders>
        <loggers>
            <!--我们只让这个logger输出trace信息,其他的都是error级别-->
            <!--
            additivity开启的话,由于这个logger也是满足root的,所以会被打印两遍。
            不过root logger 的level是error,为什么Bar 里面的trace信息也被打印两遍呢
            -->
            <logger name="log4j2learn.Hello" level="trace" additivity="true">
                <appender-ref ref="Console"/>
            </logger>
            <logger name="log4j2learn" level="info" additivity="true">
                <appender-ref ref="Console"/>
            </logger>
            <root level="error">
                <appender-ref ref="Console"/>
            </root>
        </loggers>
    </configuration>

    样例代码如下

    package log4j2learn;
    
    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.LogManager;
    
    
    public class Hello
    {
        public static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Hello.class.getName());
        public static void main(String[] args)
        {
            add(1, 2);
        }
    
        public static int add(int a , int b)
        {
            logger.entry(a, b);
            logger.info("我是info信息");
            logger.warn("我是warn信息");
            logger.error("我是error信息");
            logger.fatal("我是fatal信息");
            logger.printf(Level.TRACE, "%d+%d=%d", a, b, a + b);
            logger.exit(a + b);
            return a + b;
        }
    }

    输出信息如下:

    因为样例代码中使用了 public static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Hello.class.getName()); ,即使用名为log4j2learn.Hello的logger,该logger继承自名为root和log4jlearn的logger,所以所有信息都会输出三份。

    2017-02-13 15:21:33.756 [main] TRACE log4j2learn.Hello - Enter params(1, 2)
    2017-02-13 15:21:33.756 [main] TRACE log4j2learn.Hello - Enter params(1, 2)
    2017-02-13 15:21:33.756 [main] TRACE log4j2learn.Hello - Enter params(1, 2)
    2017-02-13 15:21:33.758 [main] INFO  log4j2learn.Hello - 我是info信息
    2017-02-13 15:21:33.758 [main] INFO  log4j2learn.Hello - 我是info信息
    2017-02-13 15:21:33.758 [main] INFO  log4j2learn.Hello - 我是info信息
    2017-02-13 15:21:33.759 [main] WARN  log4j2learn.Hello - 我是warn信息
    2017-02-13 15:21:33.759 [main] WARN  log4j2learn.Hello - 我是warn信息
    2017-02-13 15:21:33.759 [main] WARN  log4j2learn.Hello - 我是warn信息
    2017-02-13 15:21:33.759 [main] ERROR log4j2learn.Hello - 我是error信息
    2017-02-13 15:21:33.759 [main] ERROR log4j2learn.Hello - 我是error信息
    2017-02-13 15:21:33.759 [main] ERROR log4j2learn.Hello - 我是error信息
    2017-02-13 15:21:33.759 [main] FATAL log4j2learn.Hello - 我是fatal信息
    2017-02-13 15:21:33.759 [main] FATAL log4j2learn.Hello - 我是fatal信息
    2017-02-13 15:21:33.759 [main] FATAL log4j2learn.Hello - 我是fatal信息
    2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - 1+2=3
    2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - 1+2=3
    2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - 1+2=3
    2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - Exit with(3)
    2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - Exit with(3)
    2017-02-13 15:21:33.760 [main] TRACE log4j2learn.Hello - Exit with(3)
    
    Process finished with exit code 0

    问题

    这种继承机制的适用场景是什么呢?

    如果说适用于将日志信息送到上一级别存储到其它位置,那么在当前logger级别引入一个额外的Appender就可以满足这个需求。搞不懂继承机制有什么用。

  • 相关阅读:
    转:C++ 智能指针的正确使用方式
    C/C++各个周期的学习
    转: 工作中用的C++库
    转:【软件设计】深入理解日志系统的意义
    初级爬虫第四天
    初级爬虫第三天
    初级爬虫第二天
    初级爬虫第一天
    pep8介绍
    MySQL训练营01
  • 原文地址:https://www.cnblogs.com/superbaby11/p/6394011.html
Copyright © 2020-2023  润新知