log4j-升级log4j2

common-logging

common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着log4j来使用。使用它的好处就是,代码依赖是common-logging而非log4j, 避免了和具体的日志方案直接耦合,在有必要时,可以更改日志实现的第三方库。

 

使用common-logging的常见代码:
[java]  view plain  copy 
  1. import org.apache.commons.logging.Log;  
  2. import org.apache.commons.logging.LogFactory;  
  3.   
  4. public class A {  
  5.     private static Log logger = LogFactory.getLog(this.getClass());  
  6. }  
动态查找原理:Log 是一个接口声明。LogFactory 的内部会去装载具体的日志系统,并获得实现该Log 接口的实现类。LogFactory 内部装载日志系统的流程如下:
  1. 首先,寻找org.apache.commons.logging.LogFactory 属性配置。
  2. 否则,利用JDK1.3 开始提供的service 发现机制,会扫描classpah 下的META-INF/services/org.apache.commons.logging.LogFactory文件,若找到则装载里面的配置,使用里面的配置。
  3. 否则,从Classpath 里寻找commons-logging.properties ,找到则根据里面的配置加载。
  4. 否则,使用默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用JDK14Logger 实现,再没有则使用commons-logging 内部提供的SimpleLog 实现。
从上述加载流程来看,只要引入了log4j 并在classpath 配置了log4j.xml ,则commons-logging 就会使log4j 使用正常,而代码里不需要依赖任何log4j 的代码。

slf4j

slf4j全称为Simple Logging Facade for JAVA,java简单日志门面。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。

使用slf4j的常见代码:

[java]  view plain  copy 
  1. import org.slf4j.Logger;  
  2. import org.slf4j.LoggerFactory;  
  3.   
  4. public class A {  
  5.     private static Log logger = LogFactory.getLog(this.getClass());  
  6. }  


slf4j静态绑定原理:SLF4J 会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder; 该类里面实现对具体日志方案的绑定接入。任何一种基于slf4j 的实现都要有一个这个类。如:org.slf4j.slf4j-log4j12-1.5.6: 提供对 log4j 的一种适配实现。注意:如果有任意两个实现slf4j 的包同时出现,那么就可能出现问题。

 

slf4j 与 common-logging 比较

common-logging通过 动态查找的机制,在程序运行时自动找出真正使用的日志库。由于它使用了ClassLoader寻找和载入底层的日志库, 导致了象OSGI这样的框架无法正常工作,因为OSGI的不同的插件使用自己的ClassLoader。 OSGI的这种机制保证了插件互相独立,然而却使Apache Common-Logging无法工作。

slf4j编译时静态绑定真正的Log库,因此可以再OSGI中使用。另外,SLF4J 支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“current user is: {}”, user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。

Log4j

Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。

LogBack

Logback是由log4j创始人设计的又一个开源日记组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。 

Log4j 与 LogBack 比较

LogBack作为一个通用可靠、快速灵活的日志框架,将作为Log4j的替代和SLF4J组成新的日志系统的完整实现。LOGBack声称具有极佳的性能,“ 某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。 LogBack创建记录器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。 另外,LOGBack的所有文档是全面免费提供的,不象Log4J那样只提供部分免费文档而需要用户去购买付费文档。 


性能自测

slf4j-     count for   10000000 time   cosume  time:572159

log4j2     count for   10000000 time   cosume  time:566609

               count for   10000000time   cosume  time:520813


               

没有控制台输出  count for   100000000  time   cosume  time:82587  

                                         count for   200000000time   cosume  time:168422

异步 

             count for   100000000time   cosume  time:81240

             count for   200000000time   cosume  time:166411

 

             没有控制台输出     count for   100000000time   cosume  time:94931  没加三方jar

             count for   10000000time   cosume  time:930125  没加三方jar

              count for   10000000time   cosume  time:413857

 

异步log 大大提升io性能   可以全部异步 可部分异步

优点:

高吞吐量     使用异步io的性能的是同步io的68倍;

响应延迟很低比同步io

缺点:

有少量情况下会丢失异常信息

官方性能

 

 

 

接入步骤

 

1.删除所有log4j slf4j   common-logging的相关jar包

列举oms和switch-lib中删除的包

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

<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>jcl-over-slf4j</artifactId>
 <version>1.7.6</version>
</dependency>
<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 <version>1.7.6</version>
</dependency>

<dependency>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 <version>1.2.15</version>
</dependency>
<dependency>
 <groupId>commons-logging</groupId>
 <artifactId>commons-logging</artifactId>
 <version>1.1</version>
</dependency>

2.添加mavan依赖

<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-api</artifactId>
 <version>2.6.2</version>
</dependency>
<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-core</artifactId>
 <version>2.6.2</version>
</dependency>
<dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-slf4j-impl</artifactId>
 <version>2.6.2</version>
</dependency>

3.修改配置文件log4j和log4j2 配置文件需要生成一个新的配置名字为log4j

  配置文件几个区别详情看文档

http://logging.apache.org/log4j/2.x/manual/migration.html 

举例下工程中的修改的小列子

log4j1的控制台输出

log4j2的控制台输出

然后把log4j1配置文件中  

改为

 

 

4.统一使用slf4j配置log4j2的方式,删除代码中用到的其余log组件代码

统一用下列方式

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 private static final Logger  log = LoggerFactory.getLogger(LogConstants.SERVICE_LOG);

 

5.排除系统中所有包涵的slf4j-log4j12,本人是用eclipse的组件进行排除的,有其余方法尚可

列觉排除过的包

<dependency>
 <groupId>com.meituan.mobile</groupId>
 <artifactId>hotel-switch-lib</artifactId>
 <version>1.0.1.68-SNAPSHOT</version>
 <exclusions>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-simple</artifactId>
 </exclusion>
 <exclusion>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-api</artifactId>
 </exclusion>
 </exclusions>
</dependency>

 

<dependency>
 <groupId>com.sankuai.xm</groupId>
 <artifactId>xm-pub-api-sdk</artifactId>
 <version>1.2-SNAPSHOT</version>
 <exclusions>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 </exclusions>
</dependency>

<dependency>
 <groupId>com.meituan.mobile</groupId>
 <artifactId>hotel-lib</artifactId>
 <version>1.5.7.4</version>
 <exclusions>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 </exclusions>
</dependency>

 

<dependency>
 <groupId>com.meituan.cache</groupId>
 <artifactId>redis-cluster-client</artifactId>
 <version>1.0.2.1</version>
 <exclusions>
 <exclusion>
 <groupId>com.alibaba.fastjson</groupId>
 <artifactId>fastjson</artifactId>
 </exclusion>
 <exclusion>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 </exclusion>
 </exclusions>
 <!-- 这里请换成要使用的版本,正式发布版本在1.0以上,目前仅有测试版本0.2 -->
</dependency>

 

 

 

小提示:一定要排出系统其余依赖包中附带的不同的log4j版本,如果出现多个版本会出现对版本绑定错误



qq交流群:468246651  欢迎更多技术达人进群讨论技术一起成长
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值