1. Slf4j的使用

在上一篇随笔:SSH使用Log4j的基础上配置。

(1)导入两个文件:slf4j-api-1.5.8.jar和slf4j-log4j12-1.5.8.jar。

(2)在需要日志的地方写入下面的代码:

        Logger logger = LoggerFactory.getLogger(XXX.class);
logger.warn("Time: {}",new Date());

第1行代码是通过工厂模式获得一个Logger,第2行代码使用Logger输出日志,{}是占位符,实现字符串的拼接。

2. Slf4j的原理

Slf4j和Commons-logging一样,并不是真正的日志实现,只是日志接口。Log4j、Logback等才是真正的日志实现。当调用Slf4j时,通过工厂模式寻找合适的实现,并返回实现。比如上面的例子,引入了Slf4j和Log4j的适配--slf4j-log4j12-1.5.8.jar,在上一篇随笔中引入了log4j-1.2.14.jar,这样,就会把Log4j作为日志的实现。

3. 为什么要使用Slf4j

有两个原因,一个是减少生成字符串的成本,另一个是使代码和日志实现独立。

比如下面的代码:

logger.debug("Result: " + getResult());

"Result: " + getResult()是作为debug()的参数,所以要先生成这个字符串,再调用debug()。如果getResult()运算量很大,耗费了很多资源才生成出来,但是定义的日志级别不包括DEBUG,这样调用getResult()就是不必要的,白白浪费了很多资源。当然,也可以先判断一下再调用:

        if (logger.isDebugEnabled()) {
logger.debug("Result: " + getResult());
}

但是这样代码就显得不够简洁。

Slf4j就不存在这个问题:

logger.debug("Result: {}", getResult());

占位符{}在运行时被后面的getResult()替换,所以如果日志级别不包括DEBUG,就不会调用debug(),也不会去调用getResult()了,避免了资源的浪费,也不必再去判断isDebugEnabled(),使代码更加简洁。

第二个原因是使代码和日志独立,如果在一个类库中使用Log4j,而加载这个类库的项目使用的是Logback,这样就必须把Log4j也加载进你的项目,还要进行修改和维护,带来不必要的麻烦。而如果类库使用的是Slf4j,就不存在这个问题了,不论你的项目使用的是哪一种日志实现都是可以的。

SSH使用Slf4j的更多相关文章

  1. JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j [转]

    1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>lo ...

  2. SSH框架整合 日志处理Spring结合 log4j、slf4j

    1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>lo ...

  3. Mac下maven工程的创建,并搭建SSH环境

    最近项目有用到maven,就特地学了一下.maven的一句话攻略就是,项目托管.帮你解决各种项目琐事:清理,导包....等等. 首先先到apach官网去下载一个maven的包,http://maven ...

  4. SSH中的jar包讲解(1)

    我们在搭建SSH框架的时候,需要引入各自的一些jar包,相信很多初学者跟我一样,搜个资料,照搬过来(当然版本还得对应),至于为什么要引入这些个jar包,引入它们的作用是啥子,一头雾水,今天我就来跟这些 ...

  5. SSH环境搭建步骤解析

    一.建立Java web project:AngelSSH 二.引入jar包,必要清单如下 2.1,Struts2 commons-fileupload  文件上传组件 commons-io   io ...

  6. maven之ssh项目搭建

    1:新建maven-archetupe-webapp项目 2:web.xml配置文件如下 <?xml version="1.0" encoding="UTF-8&q ...

  7. SSH框架应用中常用Jar包用途介绍

    struts2需要的几个jar包:1)xwork-core-2.1.62)struts2-core-2.1.83)ognl-2.7.34)freemarker-2.3.155)commons-io-1 ...

  8. maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)

    前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆 ...

  9. .net到Java那些事儿--整合SSH

    一.介绍       整体介绍分成两个部分,第一.net转到Java的原因,第二开发SSH时候的环境介绍:       .net到Java的原因: .net开发也将近快3年的样子,加上现在的老东家换过 ...

随机推荐

  1. 关于面试总结2-SQL学生表

    前言 接着上一篇https://www.cnblogs.com/yoyoketang/p/10065424.html,继续学生表SQL 1.计算每个人的平均成绩, 要求显示字段: 学号,姓名,平均成绩 ...

  2. java根据jar包反编译后修改再打包回jar的做法

    1. 得到一个待要修改的jar包 2. 我的环境是windows,然后解压这个jar包,得到一堆class文件,这时候就找到你需要的那个class文件 3. 我首先是使用jd-gui工具看一下这个cl ...

  3. 【转】ubuntu apt-get update 失败解决

    FROM : http://blog.csdn.net/ronghua_liu/article/details/8609450 当运行apt-get update后出现如下错误时:E: Some in ...

  4. 数据库分库分表中间件:Mycat;分布式数据库;mysql的分布式事务

    官网:http://mycat.io/,里面有电子书籍可以下载:http://www.mycat.io/document/mycat-definitive-guide.pdf 旧版本下载地址:http ...

  5. float,double等精度丢失问题 float,double内存表示

    问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 来自MSDN的解释: http://msdn.microsoft.com/zh-cn/c151dt3s. ...

  6. matlib常用知识

    把文件装入矩阵 x = load('ex4x.dat'); y = load('ex4y.dat'); [m, n] = size(x); %得到矩阵x的行数和列数 ex4x.dat共80行,2列,通 ...

  7. linux中断

    [一].中断底半部 1. 软中断    --->>>  执行在中断上下文  --->>>  会被中断打断,不会被软中断或进程打断  --->>> ...

  8. Windows server 2012 R2 与 Windows 2016 的双系统重启选项

    一台主机上,同时安装了Windows 2012R2还有Windows 2016, 但是如何能在任意一个系统重启到另一个呢? 下图中,在Win2012R2中,无法选择重启到2016中. 解决方案 === ...

  9. SharePoint 2016 IT Preview的新feature列表

    大致看了一下, 其中关于存储的部分貌似没有. 感觉Hybrid in SharePoint 2016未来可以做的事情比较多吧, 必须赶紧弄个cloud的东西开始玩玩了. Search的部署的更新, 以 ...

  10. Neo4j 2.0 生产环境集群搭建

    一.在windows上搭建Neo4j ha cluster的配置方法: 例如:建立集群的三台机器的ip分别为:10.230.9.91,10.230.9.92,10.230.9.93. 10.230.9 ...