前言:本文将在slf4j的基础上解释log4j的应用,阅读本文前可先行阅读SLF4J源码解析-LoggerFactory(二)

前言概要

在前言中提到的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类来查看,本文则不进行简析了,此处只作总结

  1. 读取系统变量log4j.defaultInitOverride,如果没指定或者指定的值为false则继续读取。默认为false

  2. 读取系统变量log4j.configuration,如果指定了配置文件路径则读取,反之则往下

  3. 读取classpath路径下的log4j.xml,如果不存在则继续往下

  4. 读取classpath路径下的log4j.properties,找不到则打印警告信息

  5. 其中关于配置文件的加载类也可以自行指定,由系统变量log4j.configurationClass指定

小结

  1. log4j是我们常用的日志打印工具,本文在slf4j的基础上简单的分析了log4j日志工具的使用,不管是结合slf4j还是独立使用自身的api,均是通过log4j-api中的LogManager#getLogger()来获取日志对象

  2. 其中对于log4j的配置文件读取可见本文的详细内容

log4j源码解析的更多相关文章

  1. log4j源码解析-文件解析

    承接前文log4j源码解析,前文主要介绍了log4j的文件加载方式以及Logger对象创建.本文将在此基础上具体看下log4j是如何解析文件并输出我们所常见的日志格式 附例 文件的加载方式,我们就选举 ...

  2. Log4j源码解析--Layout类解析

    本文转载上善若水的博客,原文出处:http://www.blogjava.net/DLevin/archive/2012/07/04/382131.html.感谢作者的分享. Layout负责将Log ...

  3. Log4j源码解析--框架流程+核心解析

    OK,现在我们来研究Log4j的源码: 这篇博客有参照上善若水的博客,原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.htm ...

  4. Log4j源码解析--LoggerRepository和Configurator解析

    本文转自上善若水的博客,原文出处:http://www.blogjava.net/DLevin/archive/2012/07/10/382678.html.感谢作者的无私分享. LoggerRepo ...

  5. Log4j源码解析--Appender接口解析

    本文转自上善若水的博客,原文出处:http://www.blogjava.net/DLevin/archive/2012/07/10/382676.html.感谢作者的无私的分享. Appender负 ...

  6. Log4j源码解析--核心类解析

    原文出处:http://www.blogjava.net/DLevin/archive/2012/06/28/381667.html.感谢上善若水的无私分享. 在简单的介绍了Log4J各个模块类的作用 ...

  7. SLF4J源码解析-LoggerFactory(一)

    slf4j的含义为Simple logging facade for Java,其为简单的为java实现的日志打印工具,本文则对其源码进行简单的分析 JAVA调用SLF4J public class ...

  8. java 日志体系(四)log4j 源码分析

    java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...

  9. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

随机推荐

  1. [编辑器]vim常用操作

    我是ide的用户,对于vim一只停留在:打开.看.写.关闭基本操作,因为现在更多的接触linux服务器,所以为了提高 效率,用好vim是必备技能!下面罗列一些vim的常用操作,用做备忘(不断更新): ...

  2. Hadoop之HDFS及NameNode单点故障解决方案

    Hadoop之HDFS 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 H ...

  3. 如何得到iPhone手机的UUID

    背景 测试ad-hoc打包方式打出来的包,必须在证书里面配置手机的uuid才能安装. 这样就需要获取iPhone手机的uuid来进行证书配置 一般来说iPhone手机可以安装通过Apple发布的软件. ...

  4. 项目DEMO下载

    1.mybatis_generator自动生成代码demo github项目地址:https://github.com/JsonShare/mybatis_generator 2.设计模式解密系列示例 ...

  5. 运行Jmeter.bat出错:Not able to find java executor or version. Please check your installation. errorlevel=2

    下载JMeter. 解压后运行Jmeter.bat竟然报错了. 解决办法整理: 方法1: 1.检查JDK环境变量配置: ①系统变量→新增JAVA_HOME. 变量值填写jdk的安装目录(本人是 E:\ ...

  6. MS MDS系列之MDS层次结构(Hierarchy)

    在Master Data Services中,Hierarchy的作用主要用于: 对同属性成员进行分组 聚合成员用于分析和报告输出 写在开始:显示层次结构(Explicit Hierarchy)即将在 ...

  7. 【CSS】div父容器根据子容器大小自适应

    Div即父容器不根据内容自动调节高度,我们看下面的代码: <div id="main"> <div id="content"></ ...

  8. vue使用之剑走偏锋——菜单组件篇

    背景 习惯了这样的写法了,上来先来一个背景,交待一下事情的起因.事情的起因很简单,用惯了mvc框架,想来一发前后端完全分离的框架试试.选用的人员和技术是这样子的,让原本做java的web开发的人员使用 ...

  9. Redis-位图法实现简单统计

    比如一个网站有1亿个用户, 现在要统计一周内连续登录的用户 方法: 可以用一个字节8个位表示7个人, 首位不算固定为0, 若某人周一登录则置为1, 没登录则为0 127.0.0.1:6379> ...

  10. 使用语音识别JAVA SDK 的MAVEN源代码制作语音控制智能家居Java APP-------MAVEN工程加载问题解决

    一直想做一个可以录音的可执行JAVA APP,实现自然语言对话. 第一步就是实现把录音转成语义,比如你对着话筒说"你好",你获取回答相应的回复.你对着话筒说"今天的天气& ...