【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
文件:
- DTD 的学习和理解 - 不无聊 - 博客园 (自己整理的)
- 一个
XML
实例:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html log4j.xml
与log4j.dtd
的配置详细说明与使用 - CSDN博客 https://blog.csdn.net/tianyafeng123xin/article/details/51303551
二、学习总结:
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一直存在,并且不能被检索?)
- it always exists,
- 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 博客
备份:
- 之前301使用的打印SQL的配置:https://drive.google.com/open?id=1IVwo6DWQZMSixhTHfaYmswpeqBtAWVs_
- 活动提报系统自己更改后打印SQL的配置:[https://drive.google.com/open?id=1XwRFHTSQ9W3G_1sjuOkCU_Q4B7_fd9GE](
四、后续学习计划
- 先看完1.X版本的官方文档:全部看完,都基本概念有一个了解;
- 然后看2.X版本的官方文档:进行学习和使用;
- 最后整理一份文档。
五、疑问
这个例子是不是有问题?还是因为static类的初始化问题?
六、附录:
- 序 · Log4j 2官方文档中文翻译 https://huanio.gitbooks.io/doc-log4j-2/content/ (2.X版本官方文档-翻译)
- Log4j – Maven, Ivy, Gradle, and SBT Artifacts - Apache Log4j 2 http://logging.apache.org/log4j/2.x/maven-artifacts.html (2.X版本官方文档)
- Log4j2与Slf4j的最佳实践 https://zhuanlan.zhihu.com/p/36554554 (很好的一个实践)
- 聊一聊log4j2配置文件log4j2.xml - Hafiz.Zhang - 博客园 http://www.cnblogs.com/hafiz/p/6170702.html
注:这篇博客主要说了log4j2配置文件里各个节点的含义以及作用,很详细很适合了解与入门;- log4j2 配置简要分析 - 简书 https://www.jianshu.com/p/3648ad3822c9
注:从一个可以理解的角度做了说明,而且对于过滤器有额外说明,可作为参考。同时,里面的配置文件也相对其他有不同。- Log4j2配置文件详解 - Yudar - 博客园 http://www.cnblogs.com/yudar/p/5113655.html
注:这篇博客额外说了Log4j2与Spring集成,另外还有很多日志原理的说明,比较高深。
【log4j】的学习和理解 + 打印所有 SQL的更多相关文章
- SQL Server 学习博客分享列表(应用式学习 + 深入理解)
SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...
- Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6908763.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(四)——My ...
- 学习笔记: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 ...
- SpringBoot打印MyBatis sql日志输出
SpringBoot打印MyBatis sql日志输出 默认情况下mybatis是不开启SQL日志输出,需要手动配置 方法一:(在mybatis整合在springboot框架的情况下) 只需要在配置文 ...
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- MyBatis学习 之 三、动态SQL语句
目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...
- 做项目单个功能的时候要理解需求和sql语句。
做项目单个功能的时候要理解需求和sql语句.最好直接按照给出来的sql语句或者存储过程来写,避免有极其细微的差别所造成的不同. 做宜春国税二期的时候有个功能叫夜间开票情况,钻取明细时由于没理解sql语 ...
- 保存 Mybatis打印的SQL日志到数据库
之前做项目,一般会有一张,用户操作记录的数据表,里面主要包括一些,用户请求的URL和请求参数,用以记录用户做过哪些事情.并没有以文件的形式来做记录,当然只适合于一些用户量特别少的系统. 而Mybati ...
- springboot p6spy 打印完整sql
调试时打印出sql的需求,太正常不过了,mybatis也提供了这样的功能: mybatis: configuration: log-impl: org.apache.ibatis.logging.st ...
随机推荐
- 一步步来用C语言来写python扩展
本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写... 本文介绍如何用 C 语言来扩展 ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A. Forgetting Things
链接: https://codeforces.com/contest/1247/problem/A 题意: Kolya is very absent-minded. Today his math te ...
- 019_linux驱动之_定时器的引入
(一)定义一个timer_list定时器结构体,linux 内核定时器 timer_list详解 (二)初始化定时器,当超时时间expires到之后会调用buttons_timer_function函 ...
- MySQL 8.0.15 配置 MGR单主多从
转载自:http://www.cnblogs.com/zhangzihong/p/10443526.html 一.简介 MySQL Group Replication(简称MGR)字面意思是mysql ...
- xgzc— math 专题训练(一)
Lucas定理 当\(p\)是质数时,有\((^n_m)\equiv(^{n/p}_{m/p}) * (^{n\%p}_{m\%p}) \pmod{p}\) 狄利克雷卷积 定义:\((f*g)(n)= ...
- 玩转orangpi 之frpc远程管理+pcd8544(nokia5110 屏幕) 显示运行状态
玩转orangpi 之frpc远程管理+pcd8544(nokia5110 lcd) 显示运行状态. 物件: orangepi一套(电源,网线,orangepiPC)110元 nokia 5110 l ...
- 5分钟记住列表的使用功能-Python基础前传(7)
学习任何一门技术,最重要的是逻辑而不是内容,仅会内容,我们仅仅是技术的使用者,但如果我们懂得了技术背后的逻辑,我们就是技术的创造者,所以同样领域的工作,有人月入5千,有人月入5万,就是这个差别: 学技 ...
- js 数组 删除第一个和最后一个
.shift(); 删除第一个 .pop(); 删除最后一个
- CF1197B
CF1197B 题意: 出n个柱子,每个柱子一个圆盘,其半径各不相同,每次只能将柱子上只有一个圆盘的移到相邻位置,问能否全部移到一个柱子上. 解法: 思路题. 如果所有盘子都能移动到同一个柱子上,那么 ...
- Redis字符串(String)
1.set SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值 value 关联到 key 可选参数: EX second :设置键的 ...