最近因为项目原因,认真学习了一下 log4j 相关内容,主要是从网上找资料,以及追踪原代码。
 
关于如何使用,网上有很多资料,这里不做具体介绍。下面介绍一下这些工具的关系。
 
log4j 是最强大和流行的日志工具,同时又有很多其他的日志工具,比如 logback(据说比log4j 更优秀,由同一班人马打造), java.util.logging.Logger 等。为了统一各种各样的日志工具,common-logging 出现了,下面是它所有的源代码文件:
结构明了:
1、Log 定义了统一的抽象接口
2、impl 中封装了已有的多种日志工具,比如 Log4JLogger 是对 log4j 的封装,Jdk14Logger 是对 java.util.logging.Logger 的封装, AvalonLogger/LogKietLogger 是另外日志工具的封装。最后 SimpleLog 是 common-logging 自己实现的 Logger,功能简单,是其他工具不能使用时的最终方案。
3、LogFactory 是对外的接口,使用方式为:LogFactory.getLog(Test.class)。默认实现为图中的 LogFactoryImpl。
 
slf4j 与上面的 common-logging 功能和定位相似,由一个基础的包 slf4j-api 定义了统一的日志接口 Logger,工厂接口 LoggerFactory。包 slf4j-log4j12 是 slf4j 对 log4j(1.2版本?) 的封装,其中 Log4jLoggerAdapter 包装了 org.apacha.log4j.Logger,继承于org.slf4j.Logger,Log4jLoggerFactory 是相应的工厂方法。这里两个 jar 包需要一起使用。
 
我们的项目里,是一种更加纠结的情况,三者都存在,具体是 slf4j 实现了 common-logging 的两个接口,即下图中 SLF4JLog 实现了 org.apache.commons.logging.Log,工厂方法 SLF4jLogFactory 继承了 org.apache.commons.logging.LogFactory。
个人觉得这样过于复杂,没有必要,不知道能够移除对 slf4j 的依赖。
 
关于 log4j,默认的配置文件是 log4j.properties(或者 log4j.xml,但我不太喜欢用)。引用的一些 jar 包常常已经包含了该文件(差评),有可能覆盖我们自己的配置文件,需要手工移除。当然也可以使用系统变量 log4j.configuration 指定配置文件地址,而不是使用默认文件地址。
 
commons-logging 有个默认的配置文件commons-logging.properties,该文件可有可无,这是其方便之处。其中可以设置变量 priority,解决了多个配置文件的选择问题。我觉得,如果可以在 commons-logging.properties 里面也设置 log4j.configuration 这样的属性,使其生效就完美了。然而,并没有。 
 

log4j, common-logging, slf4j 关系的更多相关文章

  1. log4j与commons-logging slf4j的关系

    1. slf4j     他只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口并没有实现     所以如果要使用就得再给它提供一个实现了些接口的日志包,     ...

  2. Slf4j与log4j及log4j2的关系及使用方法

    Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独 ...

  3. SLF4J和Logback和Log4j和Logging的区别与联系

    本文转载自:一个著名的日志系统是怎么设计出来的?(作者:刘欣) 前言 Java帝国在诞生之初就提供了集合.线程.IO.网络等常用功能,从C和C++领地那里吸引了大量程序员过来加盟,但是却有意无意地忽略 ...

  4. Common.Logging源码解析一

    Common.Logging是Apache下的一个开源日志接口组件,主要用于切换不同的日志库,因为当前流行的日志库有很多向log4j.log4net(log4j的.net版本)等等,所以为了能灵活的切 ...

  5. Common.Logging log4net Common.Logging.Log4Net 配置

    1.log4net 单独配置 log4net支持多种格式的日志输出,我这里只配置输出到本地的txt文件这种格式. <log4net> <root> <appender-r ...

  6. 使用Common.Logging+log4net规范日志管理

    Common.Logging+(log4net/NLog/) common logging是一个通用日志接口,log4net是一个强大的具体实现,也可以用其它不同的实现,如EntLib的日志.NLog ...

  7. 使用Common.Logging与log4net的组件版本兼容问题

    引用:  http://www.cnblogs.com/shijun/p/3713830.html 近期使用了Common.Logging的ILog接口做日志接口,同时利用其log4net适配器与lo ...

  8. Common.Logging源码解析二

    Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...

  9. 日常报错记录2: MyBatis:DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.------------ Cause: java.lang.NoSuchMethodException: com.offcn.dao.ShopDao.<init>()

     直接上干货:  报错归纳1: DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4 ...

  10. 使用Common.Logging+log4net规范日志管理【转载】

    使用Common.Logging+log4net规范日志管理   Common.Logging+(log4net/NLog/) common logging是一个通用日志接口,log4net是一个强大 ...

随机推荐

  1. 模块学习-json pickle

    json json序列化 import json def sayhi(name): print("hello",name) info = { 'name':'mogu', 'age ...

  2. 吴裕雄 python 神经网络——TensorFlow 花瓣识别2

    import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...

  3. socket中文奇数个出现乱码的解决办法

    用MyEclipse试了一下JAVA获取系统正在运行进程代码,结果Console输出的时候中文部分输出为乱码,在网上找了很多办法,都没有解决问题.后来发现一个方法,解决了问题,特此分享. 下面成功解决 ...

  4. 动态规划-爬楼梯问题java实现

    最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...

  5. 【PAT甲级】1046 Shortest Distance (20 分)

    题意: 输入一个正整数N(<=1e5),代表出口的数量,接下来输入N个正整数表示当前出口到下一个出口的距离.接着输入一个正整数M(<=10000),代表询问的次数,每次询问输入两个出口的序 ...

  6. linux kali 的ifconfig命令

    ifconfig命令 1.ifconfig执行页面 root@localhost:/home/zys# ifconfig lo: flags=73<UP,LOOPBACK,RUNNING> ...

  7. python3.6.5修改print的颜色

    开头部分:\033[显示方式;前景色;背景色m +想要输出的内容:\033[0m      注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,具体参数效果见下文,可以只写其中的某一个:参数 ...

  8. JavaScript - Compiling Vs Transpiling

    参考 https://blog.csdn.net/napolunyishi/article/details/20473799 https://www.stevefenton.co.uk/2012/11 ...

  9. http调用之RestTemplate

    核心方法为org.springframework.web.client.RestTemplate.doExecute(URI, HttpMethod, RequestCallback, Respons ...

  10. iOS开发应用上架必读最新苹果审核规则(史上最全版)

    官方文档 地址https://developer.apple.com/cn/app-store/review/guidelines/ App Store 审核指南 简介 App 正在改变世界,丰富人们 ...