各个日志框架之间的关系

1.总体概览


                  可以看出,实际上commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现。

                  log4j,logback等才是日志的真正实现

                  所以,基本上就是接口+具体实现的方式来使用


2.各个框架之间的集成

        (1)slf4j与log4j1集成

                  1)maven

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.12</version>
</dependency>
                 2)jar包

                 

               说明:其中的slf4j-api是slf4j自身api;log4j是log4j自身的实现;slf4j-log4j12是slf4j和log4j的集成包

        (2)slf4j与logback集成

               1)maven

        <dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.7</version>
	</dependency>

	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-classic</artifactId>
		<version>1.1.3</version>
	</dependency>

	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-core</artifactId>
		<version>1.1.3</version>
	</dependency>
               2)jar
                

                

3.日志系统之间的切换

        (1)log4j切换到logback

                  假如我们再代码中使用了log4j的api来进行日志输出,现在想在不更改代码的情况下,使之通过logback来进行实际的日志输出

                  已经使用的jar包:log4j

                  使用案例:

import org.apache.log4j.Logger;
import org.junit.Test;

public class Log4jTest {
	private static final Logger logger = Logger.getLogger(Log4jTest.class);

	@Test
	public void test() 
	{
		logger.info("this is log4j");
	}

}
             替换步骤:

             1)去掉log4j的jar包

             2)添加以下jar包

                    1>log4j-over-slf4j(实现log4j切换到slf4j)

                    2>slf4j-api

                    3>logback-core(logback实现)

                    4>logback-classic

               或者直接写maven依赖

<properties>
  	<org.slf4j-version>1.7.7</org.slf4j-version>
</properties>
....
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>slf4j-api</artifactId>  
    <version>${org.slf4j-version}</version>  
</dependency>  

<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>log4j-over-slf4j</artifactId>  
    <version>${org.slf4j-version}</version>  
</dependency>  

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.3</version>
</dependency>

            3)添加logback.xml配置文件

       这样就实现了在不更改任何代码的情况下,将log4j切换到logback


        (2)common-logging切换到logback

                  假如我们再代码中使用了common-logging的api来进行日志输出,现在想在不更改代码的情况下,使之通过logback来进行实际的日志输出

                  已经使用的jar包:common-logging-1.1.3

                  使用案例:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class JCLTest {
    private static Log log = LogFactory.getLog(JCLTest.class);
    
    @Test
    public void test()
    {
    	log.debug("Debug info.");
        log.info("Info info");
        log.warn("Warn info");
        log.error("Error info");
        log.fatal("Fatal info");
    }
}

         替换步骤:

             1)去掉common-logging的jar包(其实不去也行)

             2)添加以下jar包

                    1>jcl-over-slf4j(实现lcommon-logging切换到slf4j)

                    2>slf4j-api

                    3>logback-core(logback实现)

                    4>logback-classic

               或者直接写maven依赖

<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>slf4j-api</artifactId>  
    <version>${org.slf4j-version}</version>  
</dependency>  

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.3</version>
</dependency>

            3)添加logback.xml配置文件

       这样就实现了在不更改任何代码的情况下,将common-logging切换到logback



4.不同日志系统之间的统一

        由于项目中可能引入很多其他框架,而这些框架很有可能使用不同的日志框架,如log4j,logback,common-logging,java.util.logging等,而且就算相同日志jar的版本也有可能不同,造成项目日志体系非常混乱。

       这个时候就希望统一使用某一种日志系统来实现,这个时候就可以使用如下配置:

                <!-- log -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jul-to-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.jboss.logging</groupId>
			<artifactId>jboss-logging</artifactId>
			<version>3.1.4.GA</version>
		</dependency>
             在其中配置了几个适配器:log4j-over-slf4j, jcl-over-slf4j, jul-to-slf4j。

             然后jboss-logging部分也进行了统一的版本控制(因为依赖传递会使用离项目最近的依赖)

            剩下的就是配置logback即可

           注意:jul需要额外执行一行初始化代码

SLF4JBridgeHandler.install();// jul to slf4j



5.日志系统之间的冲突

        先总结一下相关jar包:

      (1) log4j-over-slf4j, jcl-over-slf4j, jul-to-slf4j等这些类似from-over-slf4j命名的jar,都是从一种日志系统切换到slf4j

      (2)slf4j-jcl,slf4j-log4j12等这些类似slf4j-to命名的jar,都是从slf4j切换到一种日志系统

       所以很显然就有如下2中情况:

       1) jcl-over-slf4j 与 slf4j-jcl 冲突

              jcl-over-slf4j: commons-logging切换到slf4j

              slf4j-jcl : slf4j切换到commons-logging

             如果这两者共存的话,必然造成相互委托,造成内存溢出

      2) log4j-over-slf4j 与 slf4j-log4j12 冲突

             log4j-over-slf4j : log4j1切换到slf4j

            slf4j-log4j12 : slf4j切换到log4j1

             如果这两者共存的话,必然造成相互委托,造成内存溢出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值