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 定义:日志输出级别,以及选用的Appender(Logger和Appender可以是一对多的关系,即输出到多个地方。详见 3.1)

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

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

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的继承关系。当前Logger的Appenders是所有祖先Logger的Appenders的并集。

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

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

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

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

2.4 实例说明:

如果当前logger配置的level是warn,父Logger的level是error,那么当前的level就是warn,输出warn之上级别的日志。

而对应的日志样式,输出位置等,以Appenders为准。生效的 Appenders 是祖先Logger的Appenders的并集。每个Appenders都有自己的配置,且只对自己生效。

注:

  • 有一个例外:如果Appenders配置了最小或最大输出level,那么实际输出以该Appenders的配置为准。
  • 还有:如果祖先logger配置的Appenders有重复...那么会重复输出多次...

    (解决:配置logger的additivity="false",该配置表示当前logger的祖先logger的Appenders不会对当前logger及其后代logger生效。但是当前logger的Appenders依旧生效,且对后代logger生效)

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

EnhancedPatternLayout (Apache Log4j 1.2.17 API)

PatternLayout (Apache Log4j 1.2.17 API)

三、具体使用说明

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

在logger中配置多个AppenderRef即可。如下,日志会同时输出到CONSOLE和CONSOLE-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集成,另外还有很多日志原理的说明,比较高深。

【log4j】的学习和理解 + 打印所有 SQL的更多相关文章

  1. SQL Server 学习博客分享列表(应用式学习 + 深入理解)

    SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...

  2. Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6908763.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(四)——My ...

  3. 学习笔记:oracle学习二:oracle11g数据库sql*plus命令之常用sqlplus命令、格式化查询结果

    目录 1.常用sqlplus命令 1.1 HELP命令 1.2 describe命令 1.3 SPOOL命令 1.4 其他常用命令 1.4.1 define命令 1.4.2 show命令 1.4.3 ...

  4. SpringBoot打印MyBatis sql日志输出

    SpringBoot打印MyBatis sql日志输出 默认情况下mybatis是不开启SQL日志输出,需要手动配置 方法一:(在mybatis整合在springboot框架的情况下) 只需要在配置文 ...

  5. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  6. MyBatis学习 之 三、动态SQL语句

    目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...

  7. 做项目单个功能的时候要理解需求和sql语句。

    做项目单个功能的时候要理解需求和sql语句.最好直接按照给出来的sql语句或者存储过程来写,避免有极其细微的差别所造成的不同. 做宜春国税二期的时候有个功能叫夜间开票情况,钻取明细时由于没理解sql语 ...

  8. 保存 Mybatis打印的SQL日志到数据库

    之前做项目,一般会有一张,用户操作记录的数据表,里面主要包括一些,用户请求的URL和请求参数,用以记录用户做过哪些事情.并没有以文件的形式来做记录,当然只适合于一些用户量特别少的系统. 而Mybati ...

  9. springboot p6spy 打印完整sql

    调试时打印出sql的需求,太正常不过了,mybatis也提供了这样的功能: mybatis: configuration: log-impl: org.apache.ibatis.logging.st ...

随机推荐

  1. Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '<>'

    1.问题 今天又在mysql中遇到了,吐血. 2.解决方案 SQL最后加上 COLLATE utf8mb4_unicode_ci SELECT t2.cust_id as cust_id_ex,t1. ...

  2. 002_Python基础学习网站

    (一)电脑端:Python 基础教程 (二)手机端:Python 基础教程

  3. mysql慢查询日志查找与分析

    mysql下执行SHOW VARIABLES LIKE '%slow_query_log%' 上图我这是本地的mysql,慢查询没开. slow_query_log :ON和OFF分别表示慢查询有没有 ...

  4. CKEditor本地图片自动上传插件

    由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...

  5. 用HTML5里的window.postMessage在两个网页间传递数据

    说明 window.postMessage()方法可以安全地实现Window对象之间的跨域通信.例如,在一个页面和它生成的弹出窗口之间,或者是页面和嵌入其中的iframe之间. 通常情况下,不同页面上 ...

  6. C++编译错误--C++连接redis:编译错误error C2371: “off_t”: 重定义;不同的基类型

    编译错误:对于编译C++调用hiredis编译错误:error C2371: “off_t”: 重定义:不同的基类型,如下图: 可能的解决方案: 1. 因为hiredis预处理器定义了_OFF_T_D ...

  7. oc Learning Blog

    http://www.cnblogs.com/heyonggang/p/3351269.html M了个J :http://www.cnblogs.com/mjios/tag/objective-c/ ...

  8. MySQL数据分析-(15)表补充:存储引擎

    大家好,我是jacky,很高兴继续跟大家分享<MySQL数据分析实战>,今天跟大家分享的主题是表补充之存储引擎: 我们之前学了跟表结构相关的一些操作,那我们看一下创建表的SQL模型: 在我 ...

  9. MySQL数据分析—(4)关系数据库的三个逻辑框架

    (一)前面课程逻辑梳理 任何一门数据的软件也好,数据构架也好,或者说是数据学科也好,最终都是要解决实际问题的,大家说是不是? 前面jacky讲为什么要引入数据库的时候,举了一个案例,大家还记的吗?大家 ...

  10. Prometheus HA详解

    Prometheus 横向扩展 当Exporter或者采集信息需要越来越多时就会考虑高可用,高可用优点不会因为集群中某个节点down而导致Prometheus不可用,可以让算力下沉; 缺点是A-Pro ...