springboot学习4使用日志:logback
springboot学习4使用日志:logback
一、基本知识说明
java中常用的几个日志级别
ERROR、WARN、INFO、DEBUG。 ERROR是这四个中级别最高的。
SpringBoot默认使用logback作为日志框架 ,所以引入起步依赖后就可以直接使用logback,不需要其他依赖。
SpringBoot会默认加载classpath:logback.xml或者classpath:logback-spring.xml 作为日志的配置文件,在springboot项目中可以直接把日志配置文件放在resources目录下。
简单使用时也可以不使用日志配置文件,将日志相关的配置直接放在application.yml中,如下
#日志设置
logging:
file: root.log
level:
com:
lyy:
dao: debug
其中file选项用来指定日志文件输出的位置,可以是相对路径,也可以是绝对路径。
level选项用来指定日志的级别,可以指定总的级别level: info
,也可以像上边这样指定某个包中日志的输出级别。
二、代码示例
loback中支持使用slf4j来记录日志,所以可以使用如下的方式来记录日志
2.1 创建日志记录器
private final static Logger logger= LoggerFactory.getLogger(CategoryDataServiceImpl.class);
这里需要导入以下两个类,都是slf4j中的类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2.2 记录日志
使用日志记录器来记录日志
logger.info("com.lyy.service.impl.CategoryDataServiceImpl.findAll is run");
三、输出mybatis的sql到日志文件中
springboot整合mbatis后如何把sql语句输出到日志文件中,
因为mybatis输出sql的日志级别默认是debug,所以这里有两种实现方式:
(1) 把整个工程的日志级别都调整成debug,按一中的方法level: info
,
(2) 指定dao接口所在的包的日志输出级别是debug
#日志设置
logging:
file: root.log
level:
com:
lyy:
dao: debug
按上面的方法配置后就可以把mybatis的sql输出到日志文件中
四、使用配置文件来配置logback
上面的示例是使用springboot的配置文件来对logback进行简单的配置就可以使用,这是因为springboot进行了一些自动配置。如果需要定制化的日志功能,就需要使用logback的配置文件来进行配置。
springboot工程中logaback配置文件的名称可以是logback.xml
,直接放在resources目录下就可以使用。使用配置文件后就可以删掉yml配置文件中的日志配置。
以下是一个配置文件的内容示例
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--格式化输出:%d表示日期,%thread表示线程名,%X表示获取MDC, %-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<property name="pattern" value="%d{yyyy-MM-dd:HH:mm:ss} [%thread] [%X{MDC_VALUE}] %-5level [%logger.%M %line] %msg%n"/>
<!--
Appender: 设置日志信息的去向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (满足指定的策略时就新建一个文件来记录)
ch.qos.logback.core.FileAppender (文件)
-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 字符串System.out(默认)或者System.err -->
<target>System.out</target>
<!-- 对记录事件进行格式化 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="allLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天轮转,规则就是根据时间表达式指定的文件名 -->
<fileNamePattern>root.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保存 30 天的历史记录,最大大小为 30GB -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<!-- 对记录事件进行格式化 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--指定某个包的日志输出级别,这里是指定dao包的日志级别-->
<logger name="com.lyy.dao" level="debug">
<appender-ref ref="STDOUT"/>
</logger>
<!--
和<logger>元素类似,但是它是根logger。默认debug
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
<root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。
-->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="allLog"/>
</root>
</configuration>
这个配置文件精简后由以下标签组成
<configuration>
定义一个变量,可以在当前配置文件中引用
<property></property>
日志记录器
<appender></appender>
指定某个包或者某个类的输出级别
<logger></logger>
指定根日志输出级别,没有特殊指定的包的日志输出全使用这个级别
<root></root>
</configuration>
这里使用的是带滚动策略的日志记录器,可以根据规则自动创建新的日志文件。
五、使用MDC来定位日志
5.1 什么是MDC
MDC是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能,是一种轻量级的日志跟踪工具。
MDC应用在应用内的线程级别,不是分布式的应用层级别,所以仅靠它无法做到分布式应用调用链路跟踪的需求。它要解决的问题主要是可以在海量日志数据中快速捞到可用的日志信息。
5.2 实现原理
通过ThreadLocal来实现,每一个请求到来时都给当前线程的ThreadLocal中放入一个标识,然后输出日志时把这个标识一起输出,这样就可以在日志中快速筛选中一次请求中输出的日志。
5.3 具体使用
从线程中拿出标识并拼接到日志上这个过程日志框架已经帮我们处理了,只需要在日志框架的配置文件中定义日志格式时使用%X{MDC_KEY}
拿出MDC_KEY
对应的值
<property name="pattern" value="%d{yyyy-MM-dd:HH:mm:ss} [%thread] [%X{MDC_VALUE}] %-5level [%logger.%M %line] %msg%n"/>
其中MDC_KEY
是自定义的MDC键名称,日志框架根据它来取对应的值。
给ThreadLocal中放入这个值的过程需要我们自己完成,可以使用过滤器或者spring的aop来拦截请求,给请求的线程中放入这个值。
@Around("mdcValuePointcut()")
public Object mdcValueSet(ProceedingJoinPoint point) throws Throwable{
String mdcValue= UUID.randomUUID().toString();
System.out.println("mdcValueSet is run");
MDC.put("MDC_VALUE", mdcValue);
return point.proceed(point.getArgs());
}
springboot学习4使用日志:logback的更多相关文章
- springboot学习笔记:4.logback日志配置
springboot中日志组件推荐使用logback: 由于springboot内置了logback,所以可以直接在application.properties中配置:如果要功能丰富些,则配置下log ...
- SpringBoot学习笔记(13):日志框架
SpringBoot学习笔记(13):日志框架——SL4J 快速开始 说明 SpringBoot底层选用SLF4J和LogBack日志框架. SLF4J的使用 SpringBoot的底层依赖关系 1. ...
- 🔥SpringBoot图文教程2—日志的使用「logback」「log4j」
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- SpringBoot学习- 9、Slf4j日志
SpringBoot学习足迹 在上一篇学习中 通过画红线的注解,可以直接在下面log.debug输出日志到控制台,但是写日志文件就没那么顺利了,一直不成功,找了N种配置,以下配置方法可行 首先确保已引 ...
- Spring Boot 学习摘要--关于日志框架
date: 2020-01-05 16:20:00 updated: 2020-01-08 15:50:00 Spring Boot 学习摘要--关于日志框架 学习教程来自:B站 尚硅谷 1. 关于日 ...
- SpringBoot文档翻译系列——26.日志logging
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7613854.html 这是SpringBoot的日志内容 26 日志 Spring使用Co ...
- SpringBoot学习笔记
SpringBoot个人感觉比SpringMVC还要好用的一个框架,很多注解配置可以非常灵活的在代码中运用起来: springBoot学习笔记: .一.aop: 新建一个类HttpAspect,类上添 ...
- SpringBoot学习之基础篇
在前面的博文中,已经演示过springboot与Mybatis集成的实例,本篇再来探讨一下SpringBoot的基础. 一.关于SpringBoot SpringBoot可以基于Spring轻松创建 ...
- SpringBoot基础系列-使用日志
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996897.html SpringBoot基础系列-使用日志 概述 SpringBoot ...
随机推荐
- java面试题错题集(牛客网错题)
一.关于Object类的说法正确 Java中所有的类都直接或间接继承自Object,无论是否明确的指明,无论其是否是抽象类. Object的equals方法,只有一句话,return this==ob ...
- 关于jquery ajax不执行success回调函数
检查error函数是否执行,发现错误信息为parseerror,表示jquery解析返回结果时失败,只需要将ajax参数dataType:"json"改为"text js ...
- (转)json格式转换成javaBean对象的方法
把json格式转换成javaBean才可以.于是查了一下资料,网上最多的资料就是下面的这种方式: Java code? 1 2 3 4 5 6 7 8 9 String str = "[{\ ...
- JAVA变量声明在循环体内还是循环体外
(1) for (int i = 0; i < 10000; ++i) { Object obj = new Object(); System.out.println("obj= &q ...
- [thinkphp] 启用__PUBLIC__
我真是受够了,,, 为了解决__PUBLIC__不能用的问题 我折腾了好几天了,然后终于被我找到了原因 解决过程 首先必须贴出来帮助我的人 https://my.oschina.net/u/12630 ...
- pip知识点
pip第三方模块保存在\Lib\site-packages目录 安装第三方模块:\Script目录下->shift+鼠标右点打开powershift窗口 ->pip install 模块名 ...
- c++基础语法规则
1,c++存储类:定义函数或者变量的生命周期 auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型.声明函数时函数返回值的占位符. register 存储类用于定义存储 ...
- Java输入输出挂
import java.util.Comparator; import java.io.BufferedReader; import java.io.BufferedWriter; import ja ...
- np.c_与np.r_
import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np def test(): ''' numpy函数np. ...
- 第二十篇 Linux条件测试语句相关知识点介绍
条件测试语句的格式如下: [ 条件表达式 ] # 条件表达式两侧各有一个空格 按测试对象不同,条件测试语句共分为4中类型: 文件测试语句 逻辑测试语句 整数值比较语句 字符串比较语句 ...