SLF4J简介与使用(整合log4j)

一、概念

SLF4J的全称是Simple Logging Facade for Java,即简单日志门面。SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logging, logback和log4j。

SLF4J提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。

使用SLF4J的好处在于,你只需要按统一的方式写记录日志的代码,如:

public class LoggerTest {private static final Logger logger = LoggerFactory.getLogger(Tester.class);public static void main(String[] args) {logger.info("Current Time: {}", System.currentTimeMillis());}
}

SLF4J支持{}作为占位符,等价于C语言中的%s,而不必再进行字符串的拼接,效率有显著的提升(见后面运行结果)。

而无需关心日志是通过哪个日志系统,以什么风格输出的。因为它们取决于部署项目时绑定的日志系统。
例如,在项目中使用了SLF4J记录日志,并且绑定了log4j,则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将log4j替换成logback即可,不用修改项目中的代码。

二、依赖

SLF4J绑定各类日志框架的原理图:

由上图可知,使用SLF4J依赖于slf4j-api-1.8.0-alpha2.jar,部署时还依赖于要绑定的日志系统的jar包和相应的适配器jar包。

以绑定log4j为例,需要导入以下包:

  • slf4j-api-1.8.0-alpha2.jar
  • log4j-1.2.17.jar
  • slf4j-log4j12-1.8.0-alpha2.jar

如果使用Maven,则只需添加适配器jar包依赖即可

三、使用示例

这里以SLF4J + log4j为例。

1.在pom.xml中添加依赖(或者手动导入上述3个jar包)

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.8.0-alpha2</version>
</dependency>

2.配置log4j

在类路径下创建log4j.properties配置文件,这样log4j会自动加载配置文件。

# rootLogger参数分别为:根Logger级别,输出器stdout,输出器log
log4j.rootLogger = info,stdout,log# 输出信息到控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d [%-5p] %l %rms: %m%n# 输出DEBUG级别以上的日志到D://logs/debug.log
log4j.appender.log = org.apache.log4j.DailyRollingFileAppender
log4j.appender.log.DatePattern = '.'yyyy-MM-dd
log4j.appender.log.File = D://debug.log
log4j.appender.log.Encoding = UTF-8
#log4j.appender.log.Threshold = INFO
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern = %d [%-5p] (%c.%t): %m%n

将log4j.properties放在类路径下是最简单的做法,当然也可以通过PropertyConfigurator在代码中加载或者通过web.xml加载。

3.测试代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggerTest {private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);public static void main(String[] args) {logger.info("Current Time: {}", System.currentTimeMillis());logger.info("Current Time: " + System.currentTimeMillis());logger.info("Current Time: {}", System.currentTimeMillis());logger.trace("trace log");logger.warn("warn log");logger.debug("debug log");logger.info("info log");logger.error("error log");}
}

4.运行结果

2018-09-01 23:14:32,690 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:11) 2ms: Current Time: 1535814872683
2018-09-01 23:14:32,700 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:12) 12ms: Current Time: 1535814872700
2018-09-01 23:14:32,701 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:13) 13ms: Current Time: 1535814872701
2018-09-01 23:14:32,701 [WARN ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:15) 13ms: warn log
2018-09-01 23:14:32,701 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:17) 13ms: info log
2018-09-01 23:14:32,701 [ERROR] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:18) 13ms: error log

通常输出日志开销非常大,从上述结果可见,SLF4J通过{}作为占位符的方式输出字符串,相比字符串拼接的方式,效率有显著的提升。

5.更换日志系统

看到这里,你可能会有疑问:既然都用了log4j,为什么还要用SLF4J来写记录日志的代码呢,不是多此一举吗?

答案是否定的。假设我们不再需要log4j,而是希望改为使用java自带logging记录日志,我们需要做的仅仅是将pom.xml的依赖项slf4j-log4j12改为slf4j-jdk14即可,无需对上述测试代码做任何修改。

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId><version>1.8.0-alpha2</version>
</dependency>

是的,就是这么简单。再次运行测试代码:

九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535309
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535475
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535477
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
警告: warn log
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: info log
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
严重: error log

我们发现,此时日志已经变为以logging的方式输出。

四、总结

SLF4J的使用非常简单,甚至连官网上都说鉴于它太轻量,文档篇幅不长。

Given the small size of SLF4J, its documentation is not very lengthy.

在《阿里巴巴Java开发手册(正式版)》中,日志规约一项第一条就强制要求使用SLF4J:

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

所以从现在开始使用SLF4J吧!

引用

来源处

官方文档

SLF4J简介与使用(整合log4j)相关推荐

  1. java log4j权限被否定_SLF4J简介与使用(整合log4j)

    一.概念 SLF4J的全称是Simple Logging Facade for Java,即简单日志门面.SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util. ...

  2. slf4j导入那个依赖_SLF4J简介与使用(整合log4j)

    SLF4J简介与使用(整合log4j) 一.概念 SLF4J的全称是Simple Logging Facade for Java,即简单日志门面.SLF4J并不是具体的日志框架,而是作为一个简单门面服 ...

  3. 08.MyBatis整合Log4j

    MyBatis整合Log4j: 1.导入log4j.jar 2.在conf.xml中开启日志文件: 1 <!-- 配置日志文件 --> 2 <settings> 3 <s ...

  4. SpringBoot整合log4j

    SpringBoot整合log4j的步骤: 第一步:引入log4j依赖 <dependency><groupId>org.springframework.boot</gr ...

  5. Java各类日志门面(slf4j,commons-logging)和日志框架(log4j,logback)联系和区别

    日志门面 1.Apache通用日志接口(commons-logging.jar) Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logg ...

  6. Spring Boot 整合 log4j 实现日志管理

    摘要:最近有时间,系统的学习了一下Spring Boot框架,感觉Spring Boot很好的集成了各种框架和组件,之前我们用Spring的时候,要配置好的依赖和xml文件,现在使用Spring Bo ...

  7. mysql spring 整合日志_Spring整合log4j日志组件(转)

    Log4j是Apache的一个开放源代码项目,通过使用Log4j,控制日志信息输送的目的地可以为控制台.文件.数据库.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等 ...

  8. Mybatis整合log4j、延迟加载

    目录 整合log4j 延迟加载 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? MyBatis实现一对多有几种方式,怎么操作的? 整合log4j 1. 导入依赖 总共就2步 1.  先 ...

  9. 日志规范之slf4j整合Log4j以及Logback

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

最新文章

  1. 横竖屏切换时Activity的生命周期
  2. linux系统管理工具sar(一)
  3. php imagevue,Imagevue 2.1.4 正式注册版(PHP Flash相册源代码下载)
  4. Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——4-5
  5. 3.Spring高级话题—3.计划任务
  6. 前端学习(812):dom导读
  7. .net开发笔记(十三) Winform常用开发模式第一篇
  8. caffe 日志保存以及matlab绘制方法(windows以及ubuntu下)
  9. 照片浏览器_照片审核不通过!这可能是史上最亏的中级失败理由!
  10. phpexcel 数字格式_将文本转换为phpexcel中的数字格式
  11. 2023南京财经大学计算机考研信息汇总
  12. 《赖氏经典英语语法》第六集
  13. gif动图怎么制作?分享三个好用的方法
  14. 找出最长的有效括号内子括号的长度
  15. Python3三个简单练手小游戏
  16. 国内 WhatsApp 能用吗?WhatsApp对外贸企业的重要性?
  17. 计算机二级交付遇到问题怎么解决,交期延误问题的解决办法 !
  18. 茴字的四种写法—移动适配方案的进化
  19. CRUD(增删改查)
  20. 关于dpi、dp与sp的基础了解

热门文章

  1. c语言课程设计修改订单流程图,C语言课程设计————写下流程图! 谢谢
  2. java 合并单元格 把数据合并没了_合并单元格
  3. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件介绍)
  4. 【转】VScode快捷键(超无敌详细版)
  5. 【转】WM_MESSAGE、WM_COMMAND、WM_NOTIFY等消息有什么不同
  6. java容器类1:Collection,List,ArrayList,LinkedList深入解读
  7. doc文件转换html,HTML+CSS入门 如何使用POI将doc文件转换为HTML
  8. *【CodeForces - 280C】Game on Tree(期望模型,期望的线性性)
  9. 【牛客 - 280A】勘测(fib数列,思维,打表)
  10. C语言编程中关于负数的%运算的判定。