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包)

org.slf4j

slf4j-log4j12

1.8.0-alpha2

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即可,无需对上述测试代码做任何修改。

org.slf4j

slf4j-jdk14

1.8.0-alpha2

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

九月 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导入那个依赖_SLF4J简介与使用(整合log4j)相关推荐

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

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

  2. slf4j导入那个依赖_学习SPRINGBOOT结合日志门面SLF4J和日志实现LOGBACK的混合使用

    一.此处主要介绍在springboot工程下如何使用 logback + slf4j 进行日志记录. logback主要包含三个组成部分:Loggers(日志记录器).Appenders(输出目的在) ...

  3. SLF4J简介与使用(整合log4j)

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

  4. 手动将jar包导入pom依赖,让jar包适配本地maven项目

    前言: Oracle对maven很久没有更新依赖,虽然19年更新了一版,但pom引入一直有错误. 我用的是oralce 12的依赖,虽然有jar包,但是依赖和pom没有适配,项目打包的时候还要去中央仓 ...

  5. Angular 4 依赖注入教程之一 依赖注入简介

    目录 Angular 4 依赖注入教程之一 依赖注入简介 Angular 4 依赖注入教程之二 组件服务注入 Angular 4 依赖注入教程之三 ClassProvider的使用 Angular 4 ...

  6. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...

  7. (转载)Android studio 导入或依赖第三方库失败

    Android studio 导入或依赖第三方库失败 原文链接 在使用第三方库的时候,需要添加很多仓库,以保证可以能正确快速的下载到我们所需要的类库,但是经常会出现各种问题. 以下为个人问题总结 首先 ...

  8. 一个完整的springboot项目所需要导入的依赖合集(方便查找)

    一.springboot启动类依赖: <!--springboot启动类依赖导入--><dependency><groupId>org.springframewor ...

  9. 离线状态下IDEA导入Maven依赖爆红解决

    hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 一杯茶,一包烟,一个bug写一天! 平常在企业中进行项目开发的时候大部分都是在内网环境或者离线状态下进行的,这样就导致了使用Maven项目导 ...

最新文章

  1. SAP MM初阶之事务代码MIGO界面里的HOLD
  2. python与其他编程语言对比优点_Python编程不同于其他编程语言的优点
  3. Spark RDD使用详解1--RDD原理
  4. 利用Guava的Suppliers.memoize实现单例
  5. 谷歌F12调试公众号时,让鼠标显示出来
  6. LeetCode 12. Integer to Roman
  7. 想减少代码量,快设置一个有感知的 Aware Spring Bean
  8. Jordan Elman Neural Networks
  9. envi 打开影像报错:‘HISTOGRAM:illegal binsize or max/min‘.The result maybe invalid
  10. 2021年高压电工考试及高压电工考试资料
  11. CINTA:陪集与拉格朗日定理
  12. 抖音上热门的方法和技巧
  13. 计算日期在当月是第几周-【自然周(每月第一个周一为该月第一周)做法以及1号为第一周做法】
  14. 金融分析与风险管理——期权BSM模型
  15. 罗辑回归,Logistic Regression(or sigmoid function)
  16. 计算机勾兑双绝是谁发明,舌尖上的五粮液——记勾兑大师范玉平(图)
  17. 计算机毕业设计springboot+vue基本微信小程序的校园二手商城的设计与实现
  18. SEO之网站快速被收录
  19. 阿里柏羲带你读tomcat源码
  20. CSS阿里矢量图标(字体图标)

热门文章

  1. 微信小程序使用echarts图表(ec-canvas)
  2. 微信小程序使用moment.js
  3. 【算法篇-字符串匹配算法】BF算法和KMP算法
  4. VIEWGOOD(远古)校园网多媒体系统的搭建
  5. 电脑重装系统后一直显示请稍等怎么办?
  6. 前端:你可能不知道的动态组件玩法
  7. 十进制转化为八进制和十六进制
  8. HFish蜜罐的介绍和简单测试(一)
  9. iPhone 4韩国上市时间推迟令竞争对手获益
  10. madlife 交叉编译