SSH使用Slf4j
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的更多相关文章
- JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j [转]
1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>lo ...
- SSH框架整合 日志处理Spring结合 log4j、slf4j
1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>lo ...
- Mac下maven工程的创建,并搭建SSH环境
最近项目有用到maven,就特地学了一下.maven的一句话攻略就是,项目托管.帮你解决各种项目琐事:清理,导包....等等. 首先先到apach官网去下载一个maven的包,http://maven ...
- SSH中的jar包讲解(1)
我们在搭建SSH框架的时候,需要引入各自的一些jar包,相信很多初学者跟我一样,搜个资料,照搬过来(当然版本还得对应),至于为什么要引入这些个jar包,引入它们的作用是啥子,一头雾水,今天我就来跟这些 ...
- SSH环境搭建步骤解析
一.建立Java web project:AngelSSH 二.引入jar包,必要清单如下 2.1,Struts2 commons-fileupload 文件上传组件 commons-io io ...
- maven之ssh项目搭建
1:新建maven-archetupe-webapp项目 2:web.xml配置文件如下 <?xml version="1.0" encoding="UTF-8&q ...
- 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 ...
- maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)
前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆 ...
- .net到Java那些事儿--整合SSH
一.介绍 整体介绍分成两个部分,第一.net转到Java的原因,第二开发SSH时候的环境介绍: .net到Java的原因: .net开发也将近快3年的样子,加上现在的老东家换过 ...
随机推荐
- python测试开发django-17.admin后台管理
前言 通常一个网站开发,需要有个后台管理功能,比如用后台管理发布文章,添加用户之类的操作.django的admin后台管理主要可以实现以下功能 基于admin模块,可以实现类似数据库客户端的功能,对数 ...
- spring 5.0.1.RELEASE官方任然不支持velocity(平台升级)
官方说明: Dear Spring community, It is my pleasure to announce that Spring Framework 5.0.1 is available ...
- 分布式系统唯一ID生成方案汇总 转
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...
- List转换为字符串并添加分隔符
// 方法一: public String listToString(List list, char separator) { StringBuilder sb = new StringBuilder ...
- 测试 Java 类的非公有成员变量和方法
引言 对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的 ...
- C++11 std::unique_lock与std::lock_guard区别及多线程应用实例
C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通 ...
- 查看JVM统计信息【转】
查看JVM统计信息 [myname@name ~]$ jstat -gcutil 17421 Warning: Unresolved Symbol: sun.gc.generation.2.space ...
- [leetcode]N-Queens @ Python
原题地址:https://oj.leetcode.com/problems/n-queens/ 题意:经典的N皇后问题. 解题思路:这类型问题统称为递归回溯问题,也可以叫做对决策树的深度优先搜索(df ...
- Valid Palindrome leetcode java
题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...
- Path Sum leetcode java
题目: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...