目录

主流日志框架概述

slf4j 日志框架概述

slf4j + log4j 1.X 日志组合

占位符日志记录

日志框架统一转为 slf4j

为什么将 Logger 对象声明为 private static final


日志框架产生背景

1)程序媛小张,开发了一个大型系统;
2)最开始系统中使用 System.out.println("");将关键数据打印在控制台
3)后面发现这样不容易查看之前的日志信息,于是小张开发了一个小框架来记录系统的一些运行时信息,将所有运行信息统一保存到了文件中,最原始的日志框架就叫“zhanglogging.jar”
4)在不断的开发实践中,小张觉得之前的框架需要改进,决定再加几个功能:如异步模式、自动分类归档等, 改进版的框架名字叫“zhanglogging-good.jar”
5)因为日志框架升级,以前的项目如果要使用新的日志框架,那就不得不修改源码,假设哪一天又升级了日志框架叫“zhanglogging-prefect.jar”,这样反复修改项目源码仍然不太合适
6)后面发现数据库 JDBC 的数据库驱动的模式,由 Java 提供统一的 JDBC 接口,不同的数据库供应商提供实现,切换数据库的时候,只需要直接更新数据库驱动即可,并不需要修改源码
7)于是小张也写了一个统一的日志接口层,叫 “日志门面”(日志的一个抽象层),名字叫 logging-abstract.jar;然后给项目中导入具体的日志实现就行了;典型的面向接口编程!

主流日志框架概述

1、市面上的日志框架;JUL、JCL(Apache 基金会的)、Jboss-logging、logback、log4j、log4j2、slf4j....

日志门面(日志抽象层) 日志实现
JCL(Jakarta Commons Logging-属于Apache基金会)  jboss-logging JUL(java.util.logging-Java JDK自带的)
SLF4j(Simple Logging Facade for Java) Log4j 、Log4j2、 Logback

2、其中 SLF4j 与 Log4j 、 Logback 出自同一人之手,Logback 是 Log4j 的升级版;而 Log4j2 和 Log4j 都是 Apache 的,前者表示 2.x 版本,后者表示 1.x 版本,因为两者差异较大,所以才区别对待。

3、SpringBoot 底层是 Spring 框架,而 Spring 框架默认是用 JCL,但是 SpringBoot 选用的是 SLF4j 和 logback,所以Spring Boot 的日志框架重点是学习使用 SLF4j 和 logback

4、所以为了开发日志系统扩展性更好的应用,就得从上表中左右两边各选择一个进行日志接口和实现进行开发,而且编码的时候应该调用左边的接口,而不是右边的实现,这样利于将来扩展。

slf4j 日志框架概述

1、SLF4J Github 开源地址:https://github.com/qos-ch/slf4j

2、官网地址:https://www.slf4j.org/,官网有非常详细的使用文档以及 Jar 包下载和 Maven 依赖配置等

3、开发的时候,为了应用日志系统的将来的扩展,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层里面的方法;这样以后即使更换了实现类也没有关系。官方 "Hello Wolrd" 例子代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {public static void main(String[] args) {Logger logger = LoggerFactory.getLogger(HelloWorld.class);logger.info("Hello World");}
}

4、每一个日志的实现框架都有自己的配置文件,使用 slf4j 日志门面以后,配置文件还是要用日志实现框架自己本身的配置文件,如果使用的是 logback 实现,同理也要用 logback 的配置文件。

1、第一列“SLF4J unbound”:意思是如果应用中只导入“slf4j-api.jar日志门面”,没有导入slf4j实现时,则所有调用日志记录的方法都会无效,即不会有记录.
2、第二列“SLF4J bound to logback-classic”:意思是如果导入了“slf4j-api.jar日志门面”及实现“logback-classic”的jar包,则调用SLF4J之后底层会以logback进行记录.
3、第三列“SLF4J bound to log4j”:意思是导入了“slf4j-api.jar日志门面”及实现“log4j.jar”包之后,中间还要导入一个适配包“slf4j-log412.jar”,所以当应用中调用SLF4J记录日志的时候,会先经过适配包,最后调用实现包.
4、因为 log4j 使用的时间很久了,之前并没有考虑到后来的星星之火 slf4j 可以燎原,所以导致现在使用时需要借助适配包。而 logback 本身就是专门为 slf4 写的实现包,所以不需要任何适配 。后面的 JUL 也是同理,不再累述。

slf4j + log4j 1.X 日志组合

1、在应用中的 pom.xml 中导入依赖,可以从官网获取,也可以从 maven 中央仓库获取。jar 包下载。

    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><!--log4j 适配包。即面向 slf4j 调用 API,然后它内部调用适配包,最后适配包调用 log4j--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency></dependencies>

log4j12 是 log4j 的适配包,因为 log4j 1.x 版本没有直接实现 slf4j,所以只能在中间适配一层。即程序员面向 slf4j 接口编程,然后它内部先调用适配包,最后适配包调用 log4j。

2、log4j 配置文件名称约定为 log4j.properties,放在类路径下即可:

#指定输出日志信息的级别与输出的位置
#日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR .
#console 表示下面的控制台,logFile 表示下面的日志文件.
log4j.rootLogger=DEBUG,console,logFile
#表示Logger不会在父Logger的appender里输出,默认为true
log4j.additivity.org.apache=true
#控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
#日志输出的格式
log4j.appender.console.layout.ConversionPattern=%5p [%t] (%c:%L) %d{yyyy-MM-dd HH:mm:ss,SSS} ---- %m%n
#日志文件
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
#日志文件存放的路径
log4j.appender.logFile.File=E:/logs_wmx/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
#日志输出的格式
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

占位符日志记录

1、官网手册中 “Typical usage pattern(典型使用模式)”中介绍了使用占位符的方式,如下所示:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

2、其中的 “{}” 就是占位符

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jTest {//使用日志工厂创建日志处理器private static final Logger logger = LoggerFactory.getLogger(Slf4jTest.class);public static void main(String[] args) {//占位符方式记录日志,后面的参数会动态的填充到占位符的位置logger.debug("Temperature set to {} Old temperature was{}", "huaAn", 9527);new Slf4jTest().showAddress("ShenZheng");}public void showAddress(String address) {//占位符方式记录日志,后面的参数会动态的填充到占位符的位置logger.info("address is {},is very good", address);}
}

日志框架统一转为 slf4j

1、有时一个项目比较大时,里面导入了很多库或者框架,它们自身也在记录日志,使用了各种五花八门的日志框架,假如 Spring 使用了 JCL、Hibernate 使用了 jboss-logging、MyBatis 又使用了其它的 xxxx等。

2、slf4j 官方提供了解决方案:

3、根据官方提供的上图所示,解决思想是:

1、将系统中其它日志框架删除掉;
2、用中间包来替换原有的日志框架;
3、导入 slf4j 的其他实现

为什么将 Logger 对象声明为 private static final

为什么将 Logger 对象声明为 private static final

日志框架简述、slf4j 日志框架概述,slf4j + log4j 1.X 日志组合相关推荐

  1. html 日志记录组件,使用HTML自定义格式的Log4j.properties进行日志记录

    我需要帮助编辑Apache Log4j文件的输出. 我正在使用html布局来保存创建的日志.这里是我的log4j.properties代码:使用HTML自定义格式的Log4j.properties进行 ...

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

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

  3. 的日志在哪里_写给大忙人看的,MyBatis日志如何做到兼容所有常用的日志框架?...

    前言 日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但是日志还有其他很多优秀的框架,比如:Apache Comm ...

  4. slf4j 使用 java_[JAVA]SLF4J及其实现类框架使用简介

    SLF4J介绍 SLF4J是Simple Logging Facade for Java 的简写,读法就是一个字母一个字母的读(官网的介绍视频就是这么读的).SLF4J是一个接口,规定了一些记录日志的 ...

  5. SLF4j使用、统一系统中所有的日志记录到slf4j

    SLF4j使用 在系统中使用SLF4j 开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法:给系统导入slf4的jar和logback的实现jar import ...

  6. springBoot 注入@Slf4j,框架中的方法无法调用。。。

    如果不想每次都写private  final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 一.在pom文件加入依赖 ...

  7. php+yii框架,【Yii框架 1 】PHP框架,Yii概述

    [Yii框架 一 ]PHP框架,Yii概述 PHP的框架,只接触过三种:ThinkPHP.Laravel.Yii,前两种作了解,项目中用的Yii. 一.3种框架简述 1. ThinkPHP Think ...

  8. egg 编码规范_Egg 框架简述 (仅学习)

    简述 简单层级关系 路由(Router) 内置对象 配置(Config) 中间件(MiddleWare) 插件(Plugins) 常用对象关系模型(egg-sequelize) Worker和Agen ...

  9. 【Yii框架 一 】PHP框架,Yii概述

    PHP的框架,只接触过三种:ThinkPHP.Laravel.Yii,前两种作了解,项目中用的Yii. 一.3种框架简述 1. ThinkPHP ThinkPHP是我发布的第一个PHP项目用的框架,那 ...

  10. ALSA-ASOC音频驱动框架简述

    ##ALSA-ASOC音频驱动框架简述 注意:本文只限于讲解ALSA-ASOC音频驱动框架,不深入到寄存器.时序等配置,文章有不足之处,日后逐渐完善补充 另外多谢两位前辈的博客,学到了很多,多谢. h ...

最新文章

  1. mysql可以存储标点么_MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》...
  2. 2440 nand flash和nor flash上启动
  3. win7关机快捷键_1个U盘+1款软件,电脑小白也能在家轻松重装win7系统
  4. Linux删除文件和文件夹【命令】
  5. Javascript——DOM编程
  6. 诗与远方:无题(八十四)- 自己醉了
  7. Android下写一个永远不会被KILL掉的进程/服务
  8. 【Spring】Spring 报错 AbstractMethodError hikari MicrometerMetricsTrackerFactory create
  9. 华为宣布今年将投入2亿美元推动鲲鹏计算产业发展
  10. 圆与平面的接触面积_如果把绝对圆的球体放在绝对平的平面上,那接触面是不是无限小?...
  11. PHP版本中的VC6,VC9,VC11,TS,NTS区别
  12. 安装stm32芯片包
  13. 木马病毒能损害计算机硬盘么,电脑病毒危害有哪些【图文】
  14. python聚类分析超市_Biopython聚类分析
  15. sdn 华硕二级路由_Mesh分布式路由器,能否改善全屋WiFi信号覆盖问题,路由组网分享...
  16. JavaScript window对象之atob()和btoa()
  17. java算法余弦定律_自己实现文本相似度算法(余弦定理) - 呼吸的Java - 开源中国社区...
  18. 数据库如何备份与恢复
  19. 1404 数根(函数专题)
  20. 傅里叶变换复数形式的实部代表什么_「趣味数学」傅里叶变换及其在人工智能中的应用...

热门文章

  1. php实现无限极分类算法,php实现无限极分类
  2. 习题4.5 顺序存储的二叉树的最近的公共祖先问题 (25 分)
  3. linux操作实例,linux下的一些文档操作实例 | Soo Smart!
  4. keras利用flow_from_directoryt自己构建数据集
  5. pycharm添加conda虚拟环境
  6. vs编译之连接器工具警告LNK4099的解决
  7. ValueError: expected sequence of length 791 at dim 1 (got 185)
  8. Tf-idf推导及理解
  9. oracle查询显示小写,oracle查询区分大小写
  10. python deque索引超出范围_python的常用内建模块与常用第三方模块