log4j源码解析
2017-09-04 21:13
32 查看
前言:本文将在slf4j的基础上解释log4j的应用,阅读本文前可先行阅读SLF4J源码解析-LoggerFactory(二)
此依赖包含了可以使用slf4j对应的扩展方法获取日志对象,也可以独立使用log4j本身的日志对象
由上可知是通过
可以看出其是通过
再看确切方法源码
最终日志对象都是通过
log4j的加载逻辑的实现均可以通过
读取系统变量
读取系统变量
读取classpath路径下的log4j.xml,如果不存在则继续往下
读取classpath路径下的log4j.properties,找不到则打印警告信息
其中关于配置文件的加载类也可以自行指定,由系统变量
其中对于log4j的配置文件可见本文的详细内容
前言概要
在前言中提到的slf4j的基础,其主要是通过logback的api解析来解释slf4j的工作原理,而本文的log4j与logback不同,其可以和slf4j结合使用,也可以脱离slf4j单独使用。
Maven依赖
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency>
此依赖包含了可以使用slf4j对应的扩展方法获取日志对象,也可以独立使用log4j本身的日志对象
第一种方式-结合slf4j使用
调用方式如下private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("test") ;
由上可知是通过
LoggerFactory#getLogger()方法来获取日志对象,我们分析过其是通过
StaticLoggerBinder.getSingleton().getLoggerFactory()工厂类来获取日志对象的,其中
StaticLoggerBinder一般都是供其他整合jar来实现的,本文特指
slf4j-log4j12-1.6.6.jar。我们看下log4j是如何处理的
log4j获取LoggerFactory对象
直接看log4j对StaticLoggerBinder的复写
private StaticLoggerBinder() { //直接使用的是Log4jLoggerFactory工厂类来获取日志对象 loggerFactory = new Log4jLoggerFactory(); try { Level level = Level.TRACE; } catch (NoSuchFieldError nsfe) { Util .report("This version of SLF4J requires log4j version 1.2.12 or later. See also http://www.slf4j.org/codes.html#log4j_version"); } }
可以看出其是通过
Log4jLoggerFactory来获取日志对象的。
Log4jLoggerFactory获取日志对象
先看下其构造函数public Log4jLoggerFactory() { //缓存对象 loggerMap = new HashMap(); }
再看确切方法源码
public Logger getLogger(String name) { Logger slf4jLogger = null; // protect against concurrent access of loggerMap synchronized (this) { slf4jLogger = (Logger) loggerMap.get(name); if (slf4jLogger == null) { org.apache.log4j.Logger log4jLogger; if(name.equalsIgnoreCase(Logger.ROOT_LOGGER_NAME)) { log4jLogger = LogManager.getRootLogger(); } else { log4jLogger = LogManager.getLogger(name); } slf4jLogger = new Log4jLoggerAdapter(log4jLogger); loggerMap.put(name, slf4jLogger); } } return slf4jLogger; }
最终日志对象都是通过
LogManager.getLogger()方法来获取到的,上述的
Log4jLoggerAdapter只是slf4j-api下
Logger的接口实现类,此处类似于针对于log4j的适配器。
第二种方式-独立使用
直接采用log4j本身自带的日志工厂类来获取,使用方式如下private static final org.apache.log4j.Logger log = org.apache.log4j.LogManager("test");
log4j的加载逻辑的实现均可以通过
LogManager类来查看,本文则不进行简析了,此处只作总结
读取系统变量
log4j.defaultInitOverride,如果没指定或者指定的值为false则继续读取。默认为false
读取系统变量
log4j.configuration,如果指定了配置文件路径则读取,反之则往下
读取classpath路径下的log4j.xml,如果不存在则继续往下
读取classpath路径下的log4j.properties,找不到则打印警告信息
其中关于配置文件的加载类也可以自行指定,由系统变量
log4j.configurationClass指定
小结
log4j是我们常用的日志打印工具,本文在slf4j的基础上简单的分析了log4j日志工具的使用,不管是结合slf4j还是独立使用自身的api,均是通过log4j-api中的LogManager#getLogger()来获取日志对象
其中对于log4j的配置文件可见本文的详细内容
相关文章推荐
- git版本管理软件——git初始化配置
- POJ 1287 Networking(最小生成树)
- 《UNIX网络编程 卷2》 笔记: 字节流与消息
- 矩阵拼接的函数tf.stack()与矩阵分解的函数tf.unstack()示例
- [3]442. Find All Duplicates in an Array/[3]448. Find All Numbers Disappeared in an Array(Java)
- 图书谷(www.tushugu.com)
- [置顶] 前端重点题目汇总
- 【android】3、Toolbar
- HDU 3613 Manacher算法
- shell脚本中if判断
- 前端基础知识
- 自动化运维管理平台puppet安装
- 0和5 51Nod-1433
- Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)
- 大三夏季学期实训-千峰-css-float属性小记
- ASP.NET4.5尚未在web服务器上注册,您需要手动将web服务器配置为使用ASP.NET4.5
- SQL Server游标,Cursor
- jQuery之密码验证
- 中国大学MOOC·Python网络爬虫与信息提取(二)——五个实例分析
- 长沙理工大学第十二届ACM大赛 C 安卓图案解锁