log4j, common-logging, slf4j 关系

最近因为项目原因,认真学习了一下 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 这样的属性,使其生效就完美了。然而,并没有。

时间: 2024-12-28 17:09:28

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

common.logging和log4j比较

apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现 log4j是具体的日志实现,真正负责"写"日志的这个功能 common logging本身不是log,你可以把它看做是一个日志的接口 而log4j就是日志的实现 使用common logging方式实现日志,主要的原因在于可以忽略底层的日志实现,或者说为以后的日志实现库的更换提供透明界面 你可以考虑下,假设从

Common.Logging源码解析一

Common.Logging是Apache下的一个开源日志接口组件,主要用于切换不同的日志库,因为当前流行的日志库有很多向log4j.log4net(log4j的.net版本)等等,所以为了能灵活的切换不同的日志组件以适应不同的系统(在系统的迭代过程中),所以设计了Common.Logging这个组件,下面废话不多说开始解析这个组件. 1.架构分析 首先大致浏览了下这个组件的架构 Common.Logging.Core Common.Logging 观察文件类型发现以下两点: (1).整个组件采

Common.Logging log4net Common.Logging.Log4Net 配置

1.log4net 单独配置 log4net支持多种格式的日志输出,我这里只配置输出到本地的txt文件这种格式. <log4net> <root> <appender-ref ref="RollingFileAppender" /> </root> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppende

Failed obtaining configuration for Common.Logging from configuration section &#39;common/logging&#39;

spring.net 配置时 总回出现" Failed obtaining configuration for Common.Logging from configuration section 'common/logging' 错误. 解决方案:在app.config中包含了 <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

Could not configure Common.Logging from configuration section &#39;common/logging&#39;

采用的是Winform程序,在app.config配置文件里有程序生成的语句: <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> 将之删除即可. Could not configure Common.Logging from configuration section 'common/logging'

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

近期使用了Common.Logging的ILog接口做日志接口,同时利用其log4net适配器与log4net记录器来记录系统日志,在使用过程中碰到了log4net版本问题. 项目组件管理中安装组件包: PM> Install-Package Common.Logging PM> Install-Package Common.Logging.Log4Net  [2.0.1版本:依赖Common.Logging (≥ 2.0.0); log4net (= 1.2.10)] 项目中将引用log4n

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

Common.Logging+(log4net/NLog/) common logging是一个通用日志接口,log4net是一个强大的具体实现,也可以用其它不同的实现,如EntLib的日志.NLog等. Common.Logging可以通过修改配置,更换不同的日志实现类,而不需要修改任何代码. .net 项目使用CommonLogging: 1.添加必要的程序集:Common.Logging.dll.Common.Logging.Core.dll.Common.Logging.log4net1

使用Common.Logging

Common.Logging+(log4net/NLog/) common logging是一个通用日志接口,log4net是一个强大的具体实现,也可以用其它不同的实现,如EntLib的日志.NLog等. Common.Logging可以通过修改配置,更换不同的日志实现类,而不需要修改任何代码. .net 项目使用CommonLogging: 1.添加必要的程序集:Common.Logging.dll.Common.Logging.Core.dll.Common.Logging.log4net1

Log4j,Log4j2,logback,slf4j日志学习

日志学习笔记 Log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程. Log4j有7种不同的log级别,按照等级从低到高依次为:TRACE.DEBUG.INFO.WARN.ERROR.FATAL.OFF.如果配置为OFF级别,表示关闭log. Log4j支持两种格式的配置文件:properties和xml.包含三