zoukankan      html  css  js  c++  java
  • 【log4j】的学习和理解 + 打印所有 SQL

    log4j 1.2 学习和理解 + 打印所有 SQL

    一、基本资料

    官方文档:http://logging.apache.org/log4j/1.2/manual.html(理解基本概念和其他)

    • logger的继承关系:父级就近(自己有就自己,自己没有父级就近)
    • appender的输出方式:自己+父级所有(additivity="false"只表示父级及以上不生效,不对本身生效)

    日志级别定义:Level (Apache Log4j 1.2.17 API) TRACE < DEBUG < INFO < WARN < ERROR < FATAL

    输出样式定义:PatternLayout (Apache Log4j 1.2.17 API)

    配置DTD文件和相关XML文件:

    二、学习总结:

    2.1 基本定义:

    Loggers 定义:日志输出级别,以及选用的AppenderLoggerAppender可以是一对多的关系,即输出到多个地方。详见 3.1)

    Appenders 定义:日志输出位置(文件、控制台等),输出格式,以及日志清理方式等

    Layouts 定义日志格式:比如日志输出格式。(Appenderpattern是一对一的关系)

    2.2 Logger的继承关系(就近父Logger):

    即所有属性都以最近父Logger的属性为准。确定之后,不会被其他祖先属性覆盖。

    • "com.foo" is a parent of the logger named "com.foo.Bar";(前面是后面的父logger)
    • The root logger resides at the top of the logger hierarchy. It is exceptional in two ways:(ROOT Logger一直存在,并且不能被检索?)
      1. it always exists,
      2. it cannot be retrieved by name.
    • If a given logger is not assigned a level, then it inherits one from its closest ancestor with an assigned level. (如果一个logger 没有被定义日志级别,那么他会继承他最近的祖先的日志级别)

    log方法调用的输出:只有在定义的日志级别之上(包含定义的)的日志输出才会生效。(DEBUG < INFO < WARN < ERROR < FATAL.)

    代码层次的理解说明:

    如何获取一个Logger对象?
    参考:Logger (Apache Log4j 1.2.17 API) ,注意:getLogger方法,虽然有两个,实际都是根据一个字符串(出入class时实际用的是该class的clazz.getName()参数)获取一个类对象。(唯一的,具体实现可以仔细看log4j的源码...目前我也不是很理解....)

    2.3 Appenders的继承关系(实际还是Logger):

    Appenders没有继承关系,实际是Logger的继承关系。当前LoggerAppenders是所有祖先LoggerAppenders的并集。

    当前logger的输出Appender:会继承当前loggerAppender,以及当前logger的祖先logger的所有Appender

    换句话说,就是RootLogger配置的Appender对所有Logger都生效;其他同理继承;

    另外:可以通过配置使改默认功能失效: setting the additivity flag to false。不过这个配置很神奇,如果在一个logger 上配置了该属性,那么,该loggerAppender输出依旧对后代生效,但是该logger的祖先loggerAppender输出就不会对该logger和该logger即后代生效了

    即:这个属性配置是对父级所有logger生效,对自己和自己的后代不生效。

    2.4 实例说明:

    如果当前logger配置的levelwarn,父Loggerlevelerror,那么当前的level就是warn,输出warn之上级别的日志。
    而对应的日志样式,输出位置等,以Appenders为准。生效的 Appenders 是祖先LoggerAppenders的并集。每个Appenders都有自己的配置,且只对自己生效。

    注:

    • 有一个例外:如果Appenders配置了最小或最大输出level,那么实际输出以该Appenders的配置为准。
    • 还有:如果祖先logger配置的Appenders有重复...那么会重复输出多次...
      (解决:配置loggeradditivity="false",该配置表示当前logger的祖先loggerAppenders不会对当前logger及其后代logger生效。但是当前loggerAppenders依旧生效,且对后代logger生效)

    2.5 PatternLayout 说明,解释就在下面两个类里。

    EnhancedPatternLayout (Apache Log4j 1.2.17 API)

    PatternLayout (Apache Log4j 1.2.17 API)

    三、具体使用说明

    3.1 一个logger输出到多个位置:

    logger中配置多个AppenderRef即可。如下,日志会同时输出到CONSOLECONSOLE-2对应的appender

        <logger name="com" >
            <level value="ERROR" />
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="CONSOLE-2" />
        </logger>
    

    3.2 打印所有SQL

    <?xml version="1.0" encoding="utf-8"?>
    <Configuration status="error">
      <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
          <PatternLayout>
            <Pattern>"[%-d{HH:mm:ss}][backend-gos] %p [%t] %c{1}.%M(%L) | %m%n"</Pattern>
          </PatternLayout>
        </Console>
      </Appenders>
      <Loggers>
        <Root level="DEBUG">
          <AppenderRef ref="CONSOLE"/>
        </Root>
      </Loggers>
    </Configuration>
    

    补:

    MyBatis可以一行配置直接输出SQL,方法见下。未亲测,先收藏。
    设置 Mybatis 打印调试 sql 的两种方式 - Ibex-Relieved 的专栏 - CSDN 博客

    备份:

    四、后续学习计划

    • 先看完1.X版本的官方文档:全部看完,都基本概念有一个了解;
    • 然后看2.X版本的官方文档:进行学习和使用;
    • 最后整理一份文档。

    五、疑问

    这个例子是不是有问题?还是因为static类的初始化问题?

    六、附录:

    1. 序 · Log4j 2官方文档中文翻译 https://huanio.gitbooks.io/doc-log4j-2/content/ (2.X版本官方文档-翻译)
    2. Log4j – Maven, Ivy, Gradle, and SBT Artifacts - Apache Log4j 2 http://logging.apache.org/log4j/2.x/maven-artifacts.html (2.X版本官方文档)
    3. Log4j2与Slf4j的最佳实践 https://zhuanlan.zhihu.com/p/36554554 (很好的一个实践)
    4. 聊一聊log4j2配置文件log4j2.xml - Hafiz.Zhang - 博客园 http://www.cnblogs.com/hafiz/p/6170702.html
      注:这篇博客主要说了log4j2配置文件里各个节点的含义以及作用,很详细很适合了解与入门;
    5. log4j2 配置简要分析 - 简书 https://www.jianshu.com/p/3648ad3822c9
      注:从一个可以理解的角度做了说明,而且对于过滤器有额外说明,可作为参考。同时,里面的配置文件也相对其他有不同。
    6. Log4j2配置文件详解 - Yudar - 博客园 http://www.cnblogs.com/yudar/p/5113655.html
      注:这篇博客额外说了Log4j2与Spring集成,另外还有很多日志原理的说明,比较高深。
  • 相关阅读:
    Arduino 封装库
    Arduino 学习
    Linux和UNIX监控
    mysql语句:批量更新多条记录的不同值[转]
    datagridview设置currentrow为指定的某一行[转]
    WeifenLuo组件中如何设置停靠窗体的宽度
    Win7 64位 Visio反向工程(MySQL)
    Castle.ActiveRecord (V3.0.0.130)
    位运算(2)——Number of 1 Bits
    位运算(1)——Hamming Distance
  • 原文地址:https://www.cnblogs.com/buwuliao/p/11064377.html
Copyright © 2011-2022 走看看