SpringBoot与日志
文章目录
- 一、日志框架
- 二、SLF4J 的使用
- 2.1 使用 log4J
- 2.2 slf4j 与实现框架图总览
- 2.3 统一日志记录
- 三、SpringBoot 日志关系
- 四、SpringBoot 中日志的使用
- 4.1 默认配置
- 4.2 指定配置
- 五、切换日志框架
一、日志框架
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
的名号而已
3、SpringBoot
底层是 Spring
框架,而 Spring
框架默认是用 JCL
,但是 SpringBoot
选用的是 SLF4j
和 logback
,所以SpringBoot
的日志框架重点是学习使用 SLF4j
和 logback
。
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个是
jul
和log4j
相似,同样需要适配包…
2.3 统一日志记录
如何将系统中的所有日志都统一到slf4j?
- 将系统中其他日志框架先排除出去
- 用中间包来替换原有的日志框架
- 我们导入
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-logging
,springboot
底层使用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.file
和logging.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
,如果需要使用SpringBoot
的Profile
高级功能即文档块功能则就需要使用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与日志相关推荐
- 【Springboot】日志
springBoot日志 1.目前市面上的日志框架: 日志门面 (日志的抽象层): JCL(Jakarta Commons Logging) ...
- Java开发面试题及答案,SpringBoot统一日志处理原理
<artifactId>slf4j-api</artifactId> <version>1.7.28</version> ``` 按照slf4j官方的说 ...
- SpringBoot之日志
一.日志框架简介 1.SpringBoot选用日志抽象层SLF4j和日志实现logback(Log4j的升级版). 2.SLF4j使用 2.1SLF4j使用组合 2.2SLF4j使用例子.SLF4 ...
- 玩转springboot:日志的使用
一.SLF4j使用 1.在系统中使用SLF4J 以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法: 给系统里面导入slf4j的jar和 logback的实 ...
- SpringBoot的日志管理(输出级别,输出到文件)
场景 SpringBoot实战项目搭建专栏地址: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/35688 1.SpringBoot使用默 ...
- SpringBoot生成日志文件---logback和log4j
SpringBoot生成日志文件---logback和log4j 一.logback logback是SpringBoot自带的日志文件,默认会为控制台输出INFO级别的日志,并且不会将日志文件保存. ...
- SpringBoot使用日志
转载自 SpringBoot使用日志 1.选什么日志框架 首先列举一下日志门面和实现 SpringBoot默认选用SLF4J和Logback 日志级别:springboot默认已经帮我们配置好了日志 ...
- SpringBoot默认日志logback配置解析
SpringBoot默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式 ...
- SpringBoot与日志配置
前言: 前文我们介绍了配置文件的原理还有如果切换配置文件的环境,个人觉得归纳为一手册,要用的时候查一下就好了.不然记那么多挺麻烦的.. 1.日志 1.日志框架 老生常谈,什么是日志:我们平时用Syst ...
- SpringBoot与日志slf4j使用原理
引言 在这篇博客中主要介绍的关于日志的使用,对于日志作为在开发中一个比较重要的工具,对于开发人员查找应用的错误是一个比较好的方式.对于日志的分析也是掌握应用的生存状态的最好的办法. 日志框架使 ...
最新文章
- win7删除计算机库文件,win7怎么将“库”从资源管理器导航栏中删除【图文】
- Ordering Tasks
- eclipse中Preferences的一些设置
- 阿里敏捷教练何勉:论精益思想及精益产品开发实践体系
- win7计算机右键属性桌面进程重启,win7计算机右键属性打不开怎么办
- 2021年Z世代“潮力量”洞察报告
- bootstrap 步骤条_无骨香酥炸鸡柳,做法原来如此简单,3个关键步骤,学会可以开店...
- mysql实用教程的数据构造
- 玩单片机需要学数电、模电吗?
- 体绘制加速技术之数据异步传输
- stm32 /*定时器ETR外部时钟初始化配置
- bash, sh, dash 傻傻分不清楚
- 同步传输和异步传输_同步和异步传输| 数据通讯
- CentOS 7提供的ISO镜像文件
- 搭建mpi测试环境,使用intell的mpi库
- 快解析:轻松实现共享上网
- 元学习、迁移学习、对比学习、自监督学习与少样本学习的关系解读
- 利用FME实现DLG数据无损转CAD地形图,实现CAD地物符号完美还原的解决方案,解决CAD地图符号难以还原的痛点问题,gdb转CAD,mdb转CAD,shp转CAD,shapefile转CAD
- oracle查询当天的数据(当年,当月,当日)
- 2020-10-05网络营销的起源及发展阶段