1、集成springboot过程
SpringBoot中只识别resource目录下四中文件:
- logback-spring.xml(优先级最高)
- logback.xml
- logback-spring.groovy
- logback.groovy
如果需要对配置文件名进行修改,或者希望把放到其它目录下, 可以在application中通过logging.config属性来指定, 如logging.config=classpath:config/my-log-config.xml。
resource下添加配置文件logback-spring.xml
spring-boot-starter-web中已包含logback依赖
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--配置日志的上下文名称-->
<contextName>${log.context.name}</contextName>
<!-- 常量定义start -->
<!--项目名称,也是存储日志的具体目录-->
<property name="log.context.name" value="xxx"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="log.directory" value="./logs/${log.context.name}"/>
<!--日志的字符编码-->
<property name="log.charset" value="UTF-8"/>
<!--历史记录最大保存天数-->
<property name="log.maxHistory" value="30"/>
<!--最大单个日志大小-->
<property name="log.maxSize" value="1gb"/>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS}$$${HOSTNAME}$$%level{}$$${log.context.name}$$[%thread]$$%logger{50}$$%msg%n"/>
<!--日志Error级别名称配置-->
<property name="log.error.log.level" value="ERROR"/>
<!--异步写日志的队列大小配置,默认为256-->
<property name="log.async.queue.size" value="512"/>
<!-- 常量定义end -->
<!--控制台日志输出配置,可以匹配色彩和高亮-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="com.xxx.conifg.log.MyEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}) - %yellow([%file:%line]) - %msg%n
</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- 服务器上使用的appender start -->
<!-- 默认的file appender,按天切分日志 -->
<!-- 打印INFO以上轻量日志,被ELK收集 -->
<appender name="ROLLING_FILE_DEFAULT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.directory}/${HOSTNAME}.log</file>
<append>true</append>
<prudent>true</prudent>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 仅INFO以上通过 -->
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.directory}/${HOSTNAME}_application.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
<maxFileSize>${log.maxSize}</maxFileSize>
</rollingPolicy>
<encoder class="com.xxx.conifg.log.MyEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- 错误日志,按天切分 -->
<appender name="ROLLING_FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>${log.error.log.level}</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${log.directory}/${HOSTNAME}_error.log</file>
<!-- 日志追加配置 -->
<append>true</append>
<prudent>true</prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.directory}/${HOSTNAME}_error.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录error级别的 -->
<encoder class="com.xxx.conifg.log.MyEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- debug级别日志,按大小切分 -->
<appender name="ROLLING_FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<prudent>true</prudent>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.directory}/${HOSTNAME}_debug.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
<maxFileSize>${log.maxSize}</maxFileSize>
</rollingPolicy>
<encoder class="com.xxx.conifg.log.MyEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- 异步默认日志文件的配置 -->
<appender name="ASYNC_FILE_DEFAULT" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<!--<discardingThreshold>0</discardingThreshold>-->
<!-- 20180830 将异步记录日志的方式改为可以丢失ERROR级别以下 -->
<discardingThreshold>-1</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>${log.async.queue.size}</queueSize>
<appender-ref ref="ROLLING_FILE_DEFAULT"/>
</appender>
<appender name="ASYNC_FILE_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>${log.async.queue.size}</queueSize>
<appender-ref ref="ROLLING_FILE_DEBUG"/>
</appender>
<!-- 异步错误日志文件的配置 -->
<appender name="ASYNC_FILE_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<!--<discardingThreshold>0</discardingThreshold>-->
<!-- 20180830 将异步记录日志的方式改为可以丢失ERROR级别以下 -->
<discardingThreshold>-1</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>${log.async.queue.size}</queueSize>
<appender-ref ref="ROLLING_FILE_ERROR"/>
</appender>
<!-- sql mapper -->
<logger name="com.xxx.repository.mapper" level="DEBUG" additivity="false">
<springProfile name="!dev">
<appender-ref ref="ASYNC_FILE_ERROR"/>
</springProfile>
<!-- <springProfile name="dev">-->
<!-- <appender-ref ref="STDOUT"/>-->
<!-- </springProfile>-->
</logger>
<logger name="com.xxx" level="DEBUG" additivity="false">
<springProfile name="!dev">
<appender-ref ref="ASYNC_FILE_DEBUG"/>
<appender-ref ref="ASYNC_FILE_DEFAULT"/>
<appender-ref ref="ASYNC_FILE_ERROR"/>
</springProfile>
<springProfile name="dev">
<appender-ref ref="STDOUT"/>
</springProfile>
</logger>
<root level="info">
<springProfile name="local,dev">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC_FILE_DEFAULT"/>
<appender-ref ref="ASYNC_FILE_ERROR"/>
</springProfile>
<springProfile name="!dev">
<appender-ref ref="ASYNC_FILE_DEFAULT"/>
<appender-ref ref="ASYNC_FILE_ERROR"/>
</springProfile>
</root>
</configuration>
springboot中也提供了配置文件的简单配置(只支持简单配置)
- logging.file=文件名(设置文件,可以是绝对路径,也可以是相对路径。例:logging.file=my.log)
- logging.path=日志文件路径(设置目录,会在该目录下创建spring.log文件,并写入日志内容。例:logging.path=/var/log)
- logging.level.包名=指定包下的日志级别
- logging.pattern.console=日志打印规则
2、标签说明
configuration标签
配置文件的根标签,定义Logback的全局配置。
属性:
- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。 当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
某些时候为了了解logback配置文件加载情况,配置中对应的appender、logger的装载情况等,我们需要启用logback状态数据的输出。这也是logback官网强烈推荐的,可以帮助我们排除诊断一些问题。
启用状态数据输出有两种方式:
- 在根元素(configuration) 中设置属性debug=“true”。
- 添加元素(statusListener),class使用OnConsoleStatusListener,如下:
<!-- 输出logback的本身状态数据 -->
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
子标签:
- 可包含子标签:property, appender, logger, root, shutdownHook, statusListener等
contextName标签
用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改
property标签
定义配置文件中的变量,可在其他标签中使用
- 可包含属性:name, value
属性:
- name:定义变量名称
- value:定义变量的值
子标签:无
Appender标签
日志输出器,将日志事件输出到指定目标的组件,负责将日志消息传递给特定的目标,如文件、控制台、网络等。
属性:
- name:定义Appender名称
- class:指定当前Appender是哪个实现,如:ch.qos.logback.core.ConsoleAppender(输出到控制台)
有8个输出实现如下:
1)ConsoleAppender:将日志输出到控制台
子节点:
- encoder:对日志进行格式化
示例:
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%highlight()高亮显示,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%logger{15}:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
2)FileAppender:将日志输出到文件
子节点:
- file:被写入的文件名,可以是相对目录,也可以是绝对目录
- append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true
- encoder:格式化
- prudent:如果是 true,日志会被安全的写入文件,效率低,默认是 false
示例:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
3)RollingFileAppender:将日志输出到滚动文件,可以配置文件的大小、保留文件的数量等
子节点:
- filter: 表示过滤器,用法稍后讲解。
- append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
- encoder:对记录日志进行格式化。
- rollingPolicy: 当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
- triggeringPolicy:告知 RollingFileAppender 何时激活滚动。
- prudent:当为true时,不支持FixedWindowRollingPolicy。 支持TimeBasedRollingPolicy,但是有两个限制,1.不支持也不允许文件压缩,2.不能设置file属性,必须留空
滚动策略详解:
a)SizeAndTimeBasedRollingPolicy(根据时间和文件大小的滚动策略),最常用的滚动策略,根据时间再根据文件大小来滚动生成文件
子节点:
- fileNamePattern:规定了生成的日志文件的命名规则
- maxFileSize:设定每个日志文件的最大大小。当日志文件达到最大大小时,将会触发滚动操作,创建一个新的日志文件
- maxHistory:设定保留的历史日志文件的最大数量。超过该数量的日志文件将会被删除
- totalSizeCap:设定所有日志文件的总大小上限。当日志文件的总大小超过该上限时,将会删除最旧的日志文件,以保持总大小在设定范围内。
- CleanHistoryOnStart:确定是否在应用程序启动时清除所有历史日志文件。
- TimeBasedFileNamingAndTriggeringPolicy:用于设定基于时间的滚动策略。该策略可以根据时间间隔或日期模式来触发日志文件滚动。
<!--当前项目的目录下-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_HOME}/mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 每个文件最多5MB,保存60天的历史记录,但最多20GB -->
<maxFileSize>5MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>****
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
b)TimeBasedRollingPolicy(根据时间的滚动策略),根据时间的滚动策略,既负责滚动也负责触发滚动
子节点:
- FileNamePattern:必要节点,文件名必须包含“%d”转换符, “%d”可以包含一个 java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM},如果直接使用 %d,默认格式是 yyyy-MM-dd。 RollingFileAppender 的file子节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
- maxHistory:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且 <maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件时,那些为了归档而创建的目录也会被删除。
例:每天生成一个日志文件,保存30天的
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>d://log/business.log.%d.log</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
c)FixedWindowRollingPolicy(固定窗口的滚动策略),根据固定窗口算法重命名文件的滚动策略
子节点:
- minIndex: 窗口索引最小值
- maxIndex: 窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12
fileNamePattern :必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip。
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
4)SocketAppender:将日志通过网络发送到远程主机的特定端口
项目中的日志采用的是基于ELK来进行日志管理配置如下:
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<destination>192.168.0.11:5061</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"project": "springboot-logback-elk"}</customFields>
</encoder>
</appender>
注意:在pom文件中引入logstash-logback-encoder依赖。
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.1</version>
</dependency>
5)SMTPAppender:通过电子邮件方式发送日志
6)SyslogAppender:将日志发送到 Syslog 服务器
7)DBAppender:将日志存储到数据库中
8)AsyncAppender:将日志异步输出到其他Appender
子节点:
- discardingThreshold:假如等于20则表示,表示当还剩20%容量时,将丢弃TRACE、DEBUG、INFO级别的Event, 只保留WARN与ERROR级别的Event,为了保留所有的events,可以将这个值设置为0,默认值为queueSize/5
- queueSize比较好理解,BlockingQueue的最大容量,默认为256
- includeCallerData表示是否提取调用者数据,这个值被设置为true的代价是相当昂贵的,为了提升性能, 默认当event被加入BlockingQueue时,event关联的调用者数据不会被提取,只有线程名这些比较简单的数据
- appender-ref表示AsyncAppender使用哪个具体的
进行日志输出
示例:
<!-- 异步输出 -->
<appender name="ASYNCDEBUG" class="ch.qos.logback.classic.AsyncAppender">
<!-- 默认如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志,若要保留全部日志,设置为0 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>1024</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="DEBUGFILE"/>
<includeCallerData>true</includeCallerData>
</appender>
filter标签
Appender内子标签,过滤器,Appender标签中的子标签,用任意条件对日志进行过滤,可以有多个,按照配置顺序执行
常见过滤器:
a)LevelFilter级别过滤器,根据日志级别进行过滤
子节点:
- level:设置过滤级别
- onMatch:用于配置符合过滤条件的操作
- onMismatch:用于配置不符合过滤条件的操作
其中onMatch和onMismatch有三个值: DENY(日志将立即被抛弃不再经过其他过滤器), NEUTRAL(有序列表里的下个过滤器过接着处理日志), ACCEPT(日志会被立即处理,不再经过剩余过滤器)
示例:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
b)ThresholdFilter临界值过滤器,过滤掉低于指定临界值的日志, 当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
例如:过滤掉所有低于INFO级别的日志。 示例:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
c)EvaluatorFilter求值过滤器,评估、鉴别日志是否符合指定条件。 需要额外的两个JAR包,commons-compiler.jar和janino.jar 子节点:
- evaluator:鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,
它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。
evaluator有个子标签
,用于配置求值条件。 - onMatch:用于配置符合过滤条件的操作
- onMismatch:用于配置不符合过滤条件的操作
例如:过滤掉所有日志消息中不包含“billing”字符串的日志。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- 默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return message.contains("billing");</expression>
</evaluator>
<OnMatch>ACCEPT </OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
</configuration>
encoder标签
Appender内子标签,定义日志输出的格式及编码方式,
该格式化字符串的常用占位符如下:
- %-10level:日志级别,10个字符,左对齐
- %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
- %c : 类名
- %M :当前执行日志的方法
- %thread :线程名
- %m or %ms :日志信息
- %F :当前执行日志的文件名
示例:
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--引用属性配置管理中定义的某个属性-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}$$${HOSTNAME}$$%level{}$$${log.context.name}$$[%thread]$$%logger{50}$$%msg%n</pattern>
<charset>utf-8</charset>
</encoder>
logger标签
用于指定目标目录下,类日志输出的级别以及指定那些输出器
子标签:
- appender-ref:appender的name,指定输出器,可以有多个
属性:
- name:包路径,记录该包路径下的所有类输出的日志
- level:日志级别
- additivity:日志事件是否传递给父级logger(x.y.z的父级是x.y和x和root标签),默认为true; 解释:意思就是自己打印完成之后再告诉父级再按照自己的规则打印一份(父级是x.y和x和root标签), 如果父级的additivity为true,继续向上传递;这个的意思是让父级logger按照子类的级别输出对应的日志;
additivity示例:
<logger name="com.gf.order.service.impl" level="info" additivity="true">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="com.gf.order.service" level="debug" additivity="true">
<appender-ref ref="STDOUT"/>
</logger>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
输出:
x.y.z--- DEBUG com.gf.order.controller.OrderController - =====OrderController=====debug=====
x.y.z--- INFO com.gf.order.controller.OrderController - =====OrderController=====info=====
x.y.z--- WARN com.gf.order.controller.OrderController - =====OrderController=====warn=====
x.y.z--- ERROR com.gf.order.controller.OrderController - =====OrderController=====error=====
x.y --- DEBUG com.gf.order.service.OrderService - =====[OrderService]=====debug=====
root--- DEBUG com.gf.order.service.OrderService - =====[OrderService]=====debug=====
x.y --- INFO com.gf.order.service.OrderService - =====[OrderService]=====info=====
root--- INFO com.gf.order.service.OrderService - =====[OrderService]=====info=====
x.y --- WARN com.gf.order.service.OrderService - =====[OrderService]=====warn=====
root--- WARN com.gf.order.service.OrderService - =====[OrderService]=====warn=====
x.y --- ERROR com.gf.order.service.OrderService - =====[OrderService]=====error=====
root--- ERROR com.gf.order.service.OrderService - =====[OrderService]=====error=====
x.y.z--- INFO com.gf.order.service.impl.Haha - =====《Haha》=====info=====
x.y --- INFO com.gf.order.service.impl.Haha - =====《Haha》=====info=====
root--- INFO com.gf.order.service.impl.Haha - =====《Haha》=====info=====
x.y.z--- WARN com.gf.order.service.impl.Haha - =====《Haha》=====warn=====
x.y --- WARN com.gf.order.service.impl.Haha - =====《Haha》=====warn=====
root--- WARN com.gf.order.service.impl.Haha - =====《Haha》=====warn=====
x.y.z--- ERROR com.gf.order.service.impl.Haha - =====《Haha》=====error=====
x.y --- ERROR com.gf.order.service.impl.Haha - =====《Haha》=====error=====
root--- ERROR com.gf.order.service.impl.Haha - =====《Haha》=====error=====
root标签
定义根记录器,用于指定所有未匹配到具体记录器的日志输出规则
属性:
- level:日志级别
- additivity:是否传递到
子节点: appender-ref:指定输出器
其中日志级别:ALL < TRACE < DEBUG < INFO < WARN < ERROR <FATAL <OFF
shutdownHook标签
定义Logback的关闭钩子
statusListener标签
定义状态监听器,用于监听Logback的状态变化
3、MDC分布式应用追踪请求
logback提供了MDC(Mapped Diagnostic Contexts诊断上下文映射),可以让开发人员在诊断上下文中放置信息。 通过ThreadLocal实现了线程与线程之间的数据隔离。在输出时可以通过标识符%X{key}来输出MDC中设置的内容。
分布式应用追踪请求实现思路如下:
WEB拦截器添加唯一ID==》添加ID到MDC中==》调用其他服务时ID作为Header参数 ==》输出日志添加ID参数==》请求结束清除ID==》根据相同ID排查日志
相关地址:https://blog.csdn.net/wo541075754/article/details/109193354