文章目录

  • 一、日志框架
  • 二、SLF4J 的使用
    • 2.1 使用 log4J
    • 2.2 slf4j 与实现框架图总览
    • 2.3 统一日志记录
  • 三、SpringBoot 日志关系
  • 四、SpringBoot 中日志的使用
    • 4.1 默认配置
    • 4.2 指定配置
  • 五、切换日志框架

一、日志框架

​ 1、市面上的日志框架:JULJCL(Apache 基金会的)、Jboss-logginglogbacklog4jlog4j2slf4j

日志门面(日志抽象层) 日志实现
JCLJakarta Commons Logging-属于Apache基金会) jboss-logging JULjava.util.logging-Java JDK自带的)
SLF4jSimple Logging Facade for Java Log4jLog4j2Logback

​ 2、其中 SLF4jLog4jLogback 出自同一人之手,LogbackLog4j 的升级版;而 Log4j2 只是借用了Log4j 的名号而已

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

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

二、SLF4J 的使用

2.1 使用 log4J

<!--日志-->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version>
</dependency><!--log4j需要slf4j-log4j12进行适配,slf4j-log4j12同时依赖了log4j,导入slf4j-log4j12即可-->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version>
</dependency>

log4j.properties

#指定输出信息的级别--以及输出的位置
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=D:/logs/log.txt
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
package com.hucheng.log.log4j;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @author HuCheng*/
public class Test {public static void main(String[] args) {Logger logger = LoggerFactory.getLogger(Test.class);logger.info("Hello Slf4j/Log4j");logger.error("error print");}
}

开发时,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层的方法。每一个日志的实现框架都有自己的配置文件,使用slf4j时,需要使用日志实现框架的配置文件。

2.2 slf4j 与实现框架图总览


图中,可以看出:

  • 如果只导入了slf4j-api.jar日志门面,则调用日志记录的方法无效
  • 如果导入slf4j-api.jar和日志实现logback-classic.jar,则调用slf4j之后底层会以logback进行记录
  • 如果导入slf4j-api.jar和日志实现log4j.jar,中间还需要导入一个适配包slf4j-log412.jar,所以当应用中调用SLF4J记录日志的时候,会先经过适配包,最后调用实现包
  • 第4个是jullog4j相似,同样需要适配包…

2.3 统一日志记录


如何将系统中的所有日志都统一到slf4j?

  1. 将系统中其他日志框架先排除出去
  2. 用中间包来替换原有的日志框架
  3. 我们导入slf4j其他的实现

三、SpringBoot 日志关系

通过分析spring-boot-starter的底层依赖关系,可以看出springboot通过依赖spring-boot-starter-logging来做日志。SpringBoot底层是通过slf4j+logback的方式进行日志记录,同时将其他的日志都替换成了slf4j


如何替换呢?

创建的LogFactory实际上是用SLF4JLogFactory的实例

@SuppressWarnings("rawtypes")
public abstract class LogFactory {static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";static LogFactory logFactory = new SLF4JLogFactory();

SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可。

比如Spring框架使用的是commons-loggingspringboot底层使用spring框架需要排除掉commons-logging

<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>

四、SpringBoot 中日志的使用

4.1 默认配置

SpringBoot默认集成了日志服务:

    //日志记录器Logger logger = LoggerFactory.getLogger(getClass());@Testpublic void contextLoads() {//日志的级别;//由低到高   trace<debug<info<warn<error//可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效logger.trace("这是trace日志...");logger.debug("这是debug日志...");//SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别logger.info("这是info日志...");logger.warn("这是warn日志...");logger.error("这是error日志...");}

输出:

2019-11-04 16:35:43.636  INFO 12604 --- [           main] c.h.log.SpringbootLogApplicationTests    : 这是info日志...
2019-11-04 16:35:43.636  WARN 12604 --- [           main] c.h.log.SpringbootLogApplicationTests    : 这是warn日志...
2019-11-04 16:35:43.637 ERROR 12604 --- [           main] c.h.log.SpringbootLogApplicationTests    : 这是error日志...

日志输出格式:

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n注:%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度%logger{50} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息,%n是换行符

springboot修改日志的默认配置

# 修改日志的级别,默认级别为info
logging.level.com.atguigu=trace# 指定完整的路径
#logging.file=G:/springboot.log# 仅指定路径,使用 spring.log 作为默认文件
logging.path=/spring/log# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n

当配置文件中logging.filelogging.path存在或不存在时(推荐仅使用logging.path):

logging.file logging.path Description
只在控制台输出
输出日志到指定文件中
输出到指定目录的 spring.log 文件中
相当于logging.file仅存的情况

4.2 指定配置

给类路径下放上每个日志框架自己的配置文件即可,就会替代SpringBoot的默认配置,以下是各日志实现的配置文件默认文件名:

日志实现 文件名
Logback logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JUL logging.properties

​ SpringBoot官方建议使用logback-spring.xml,具体的配置参考logback-spring.xml文件。

当使用logback.xml,应用启动时会被日志框架logback识别而使用,不经过SpringBoot,如果需要使用SpringBootProfile高级功能即文档块功能则就需要使用logback-spring.xml

profile需新增配置:

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><layout class="ch.qos.logback.classic.PatternLayout"><springProfile name="dev"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern></springProfile><springProfile name="!dev"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern></springProfile></layout>
</appender>

五、切换日志框架

使用slf4j+log4j的方式

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>logback-classic</artifactId><groupId>ch.qos.logback</groupId></exclusion><exclusion><artifactId>log4j-over-slf4j</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId>
</dependency>

使用slf4j+log4j2的方式

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

SpringBoot与日志相关推荐

  1. 【Springboot】日志

    springBoot日志 1.目前市面上的日志框架: 日志门面 (日志的抽象层):                JCL(Jakarta Commons Logging)                ...

  2. Java开发面试题及答案,SpringBoot统一日志处理原理

    <artifactId>slf4j-api</artifactId> <version>1.7.28</version> ``` 按照slf4j官方的说 ...

  3. SpringBoot之日志

    一.日志框架简介 1.SpringBoot选用日志抽象层SLF4j和日志实现logback(Log4j的升级版). 2.SLF4j使用  2.1SLF4j使用组合  2.2SLF4j使用例子.SLF4 ...

  4. 玩转springboot:日志的使用

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

  5. SpringBoot的日志管理(输出级别,输出到文件)

    场景 SpringBoot实战项目搭建专栏地址: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/35688 1.SpringBoot使用默 ...

  6. SpringBoot生成日志文件---logback和log4j

    SpringBoot生成日志文件---logback和log4j 一.logback logback是SpringBoot自带的日志文件,默认会为控制台输出INFO级别的日志,并且不会将日志文件保存. ...

  7. SpringBoot使用日志

    转载自  SpringBoot使用日志 1.选什么日志框架 首先列举一下日志门面和实现 SpringBoot默认选用SLF4J和Logback 日志级别:springboot默认已经帮我们配置好了日志 ...

  8. SpringBoot默认日志logback配置解析

    SpringBoot默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式 ...

  9. SpringBoot与日志配置

    前言: 前文我们介绍了配置文件的原理还有如果切换配置文件的环境,个人觉得归纳为一手册,要用的时候查一下就好了.不然记那么多挺麻烦的.. 1.日志 1.日志框架 老生常谈,什么是日志:我们平时用Syst ...

  10. SpringBoot与日志slf4j使用原理

    引言     在这篇博客中主要介绍的关于日志的使用,对于日志作为在开发中一个比较重要的工具,对于开发人员查找应用的错误是一个比较好的方式.对于日志的分析也是掌握应用的生存状态的最好的办法. 日志框架使 ...

最新文章

  1. win7删除计算机库文件,win7怎么将“库”从资源管理器导航栏中删除【图文】
  2. Ordering Tasks
  3. eclipse中Preferences的一些设置
  4. 阿里敏捷教练何勉:论精益思想及精益产品开发实践体系
  5. win7计算机右键属性桌面进程重启,win7计算机右键属性打不开怎么办
  6. 2021年Z世代“潮力量”洞察报告
  7. bootstrap 步骤条_无骨香酥炸鸡柳,做法原来如此简单,3个关键步骤,学会可以开店...
  8. mysql实用教程的数据构造
  9. 玩单片机需要学数电、模电吗?
  10. 体绘制加速技术之数据异步传输
  11. stm32 /*定时器ETR外部时钟初始化配置
  12. bash, sh, dash 傻傻分不清楚
  13. 同步传输和异步传输_同步和异步传输| 数据通讯
  14. CentOS 7提供的ISO镜像文件
  15. 搭建mpi测试环境,使用intell的mpi库
  16. 快解析:轻松实现共享上网
  17. 元学习、迁移学习、对比学习、自监督学习与少样本学习的关系解读
  18. 利用FME实现DLG数据无损转CAD地形图,实现CAD地物符号完美还原的解决方案,解决CAD地图符号难以还原的痛点问题,gdb转CAD,mdb转CAD,shp转CAD,shapefile转CAD
  19. oracle查询当天的数据(当年,当月,当日)
  20. 2020-10-05网络营销的起源及发展阶段

热门文章

  1. 统计|如何理解和进行两个总体方差的假设检验
  2. Unity中常用到的基础函数
  3. 机器学习 --- PCA
  4. ps2018首选项出现要求96和8之间的整数怎么办?
  5. 计算机模拟虚拟筛选操作流程
  6. 【信息学奥赛一本通】题解大全
  7. 定位尺寸的严重错误在哪里?
  8. vue+element如何一键换肤和保存换肤
  9. Unity使用键盘wasd控制绑定角色和第一人称摄像机随鼠标移动
  10. 知识图谱核心技术(一):知识图谱的概述