当一切被遗忘,那么就回到最初的地方
上一章简单介绍了SpringBoot配置文件敏感信息加密(四十六) , 如果没有看过,请观看上一章
这一章节,我们学习一下日志配置.
参考文章: Spring Boot 日志配置(超详细)
一. 日志配置处理
我们创建一个普通的 SpringBoot 项目,依赖如下
一.一 pom.xml 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.yueshushu.log</groupId>
<artifactId>SpringBoot_Log</artifactId>
<version>1.0-SNAPSHOT</version>
<name>SpringBoot_Log</name>
<description>两个蝴蝶飞学习Log配置</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<!--将该目录下的文件全部打包成类的路径-->
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
一.二 编写一个测试方法
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class LogTest {
@Test
public void logTest() {
log.info("两个蝴蝶飞学习日志配置");
}
}
查看日志输出:
以我们自定义的日志内容为例:
2023-05-18 17:23:01.433 INFO 12756 --- [ main] top.yueshushu.log.LogTest : 两个蝴蝶飞学习日志配置
打印的具体内容格式是:
日期时间精通到毫秒----日志级别(INFO)—进程id(12756)---- 分隔符 — 线程名(main, 用方括号括起来)----Logger名 (源代码的类名) ---- 日志具体内容
一.三 自定义配置日志打印信息
我们可以进行自定义日志打印信息, 在 application.yml 配置文件里面进行配置
#日志级别
logging:
# 日志级别
level:
# 默认配置
root: info
# 对某个包进行配置
top.yueshushu: debug
file:
# 日志输出位置
path: /usr/yjl/log
pattern:
# 控制台打印格式
console: '%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n'
# 文件打印格式
file: '%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === - %msg%n'
文件中查询日志打印信息
一.四 日志常见信息
一.四.一 常见的日志级别
序号 | 日志级别 | 说明 |
---|---|---|
1 | trace | 追踪,指明程序运行轨迹。 |
2 | debug | 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用。 |
3 | info | 输出重要的信息,使用较多。 |
4 | warn | 警告,使用较多。 |
5 | error | 错误信息,使用较多。 |
一.四.二 常见的日志输出格式
序号 | 输出格式 | 说明 |
---|---|---|
1 | %d{yyyy-MM-dd HH:mm:ss, SSS} | 日志生产时间,输出到毫秒的时间 |
2 | %-5level | 输出日志级别,-5 表示左对齐并且固定输出 5 个字符,如果不足在右边补 0 |
3 | %logger 或 %c | logger 的名称 |
4 | %thread 或 %t | 输出当前线程名称 |
5 | %p | 日志输出格式 |
6 | %message 或 %msg 或 %m | 日志内容,即 logger.info(“message”) |
7 | %n | 换行符 |
8 | %class 或 %C | 输出 Java 类名 |
9 | %file 或 %F | 输出文件名 |
10 | %L | 输出错误行号 |
11 | %method 或 %M | 输出方法名 |
12 | %l | 输出语句所在的行数, 包括类名、方法名、文件名、行数 |
13 | hostName | 本地机器名 |
14 | hostAddress | 本地 ip 地址 |
二. logback 配置文件配置 日志
在 resources 目录 下 创建 logback-spring.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="D:\\usr\\yjl\\log" />
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 过滤基础组件打印 -->
<logger name="top.yueshsuhu.log" level="WARN"/>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
默认有五部分配置内容信息
我们从上到下, 对这些数据进行一下主要的讲解和配置.
二.一 根节点 configuration
<configuration scan="true" scanPeriod="10 seconds">
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="10 seconds">
....
</configuration>
属性 | 信息 |
---|---|
scan | 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 |
scanPeriod | 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。 默认的时间间隔为1分钟。 |
debug | 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 |
二.二 contextName 设置上下文名称
<contextName>logback</contextName>
每个 logger 都关联到 logger 上下文, 默认的名称为 default. 可以使用设置成其他名字,用于区分不同应用程序的记录。
一旦设置,不能修改,可以通过%contextName
来打印日志上下文名称,一般来说我们不用这个属性,可有可无。
建议,最好设置一下,设置成 logback 日志的类型
二.三 property 变量配置
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="D:\\usr\\yjl\\log" />
用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。
通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量
这里通常会设置成 路径,格式, 彩色日志等信息
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<!--配置日志存放路径-->
<property name="log.path" value="D:\\usr\\yjl\\log" />
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 控制台格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%X{traceId}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}[%line]){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 输入到文件里面的日志格式 -->
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %logger{50}[%line] - %msg%n" />
会有颜色区分
二.四 appender 格式化日志输出
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略
通常是到控制台和文件中
二.四.一 控制台输出 ch.qos.logback.core.ConsoleAppender
指定级别和字符集, 很好理解.
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<!--控制台输出格式-->
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
二.四.二 同步输出到文件 ch.qos.logback.core.rolling.RollingFileAppender
通过 rollingPolicy 设置滚动策略, 这样当日志过多时,会自动拆分成不同的文件.
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="STOCK_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_stock.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/log-stock-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>300MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 过滤器, 表示不处理这一个 -->
<!-- <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
</appender>
会类似于这样的打印
二.四.三 异步输出到文件 ch.qos.logback.classic.AsyncAppender
在实际开发中,我们最好也是进行异步输出, 这样不会进行阻塞线程
通过 关联到 普通的文件输出
<!-- 异步输出 -->
<appender name ="ASYNC_STOCK_FILE" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold >0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 异步日志提取调用者数据标识 true/false -->
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref ="STOCK_FILE"/>
</appender>
二.四.四 warn 和 error 级别的文件输出
warn 和 error 一般会保存的周期长一些
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 过滤器, 表示不处理这一个 -->
<!-- <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 过滤器, 表示不处理这一个 -->
<!-- <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
</appender>
二.五 logger 具体指定某个包/类的日志打印级别
<logger>
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>
。
<logger>
仅有一个name
属性,一个可选的level
和一个可选的addtivity
属性。
属性 | 描述 |
---|---|
name | 用来指定受此logger约束的某一个包或者具体的某一个类。 |
level | 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。 |
addtivity | 是否向上级logger传递打印信息。默认是true |
有两种形式, 一种是 对包 进行指定级别, 另外一种是通过 appender 指定连接信息
二.五.一 对包指定
对特别重要的包, 可以降低级别信息
<!-- 过滤基础组件打印 -->
<logger name="top.yueshushu.log.message" level="WARN"/>
<logger name="top.yueshushu.log.trade" level="INFO"/>
二.五.二 通过 appender-ref 指定 传递性
<!--开发环境:打印控制台-->
<logger name="top.yueshushu" level="DEBUG" additivity="false">
<!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
<!-- 不打印mapper的 debug 信息 MybatisPlus的 日志打印-->
<logger name="com.yueshushu.log.mapper" level="INFO" additivity="false">
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
additivity=“false” 表示不向上传递。
二.六 root 默认配置
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会添加到这个loger。
root与logger是父子关系,没有特别定义则默认为root 。任何一个类只会和一个logger对应, 要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level
<root level="INFO">
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
root 节点里面的内容,最好是配置一下
二.七 目前较完整的日志配置
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<!--配置日志存放路径-->
<property name="log.path" value="D:\\usr\\yjl\\log" />
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 控制台格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%X{traceId}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}[%line]){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 输入到文件里面的日志格式 -->
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %logger{50}[%line] - %msg%n" />
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<!--控制台输出格式-->
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="STOCK_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_stock.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/log-stock-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>300MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 过滤器, 表示不处理这一个 -->
<!-- <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
</appender>
<!-- 异步输出 -->
<appender name ="ASYNC_STOCK_FILE" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold >0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 异步日志提取调用者数据标识 true/false -->
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref ="STOCK_FILE"/>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 过滤器, 表示不处理这一个 -->
<!-- <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 过滤器, 表示不处理这一个 -->
<!-- <filter class="top.yueshushu.collect.ZkNonLogCollectFilter" />-->
</appender>
<!-- 过滤基础组件打印 -->
<logger name="top.yueshushu.log.message" level="WARN"/>
<logger name="top.yueshushu.log.trade" level="INFO"/>
<!--开发环境:打印控制台-->
<logger name="top.yueshushu" level="DEBUG" additivity="false">
<!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
<!-- 不打印mapper的 debug 信息 MybatisPlus的 日志打印-->
<logger name="com.yueshushu.log.mapper" level="INFO" additivity="false">
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
<root level="INFO">
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
三. 其余额外配置信息
三.一 application.yml 配置文件信息
目前可以观察到, 日志的格式,文件路径,文件路径等,都是在 logback-spring.xml 文件中通过 property 属性进行配置的。
可以将其放置在application.yml 配置文件中,然后在logback-spring.xml 配置文件中进行引用配置
这个时候,就不能用 property 了,而需要用 springProperty 属性
三.一.一 application.yml 配置路径和 contextName变量
logback:
contextName: yjl
logPath: /usr/yjl/log
三.一.二 logback-spring.xml 引用变量
<contextName>${contextName}</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<!--配置日志存放路径-->
<!-- <property name="log.path" value="D:\\usr\\yjl\\log" />-->
<springProperty name="log.path" scope="context" source="logback.logPath"/>
<springProperty name="contextName" scope="context" source="logback.contextName"/>
三.二 多环境配置
我们通常有 开发环境, 测试环境,和生产环境。 在开发环境中,我们希望 打印到 debug 级别到控制台, 便于排查问题。
在生产环境中,一般是到 info 级别,甚至是 warn 级别
可以通过 springProfile 节点进行配置
三.二.一 application.yml 指定环境
logback:
contextName: yjl
logPath: /usr/yjl/log
spring:
profiles:
active: dev
三.二.二 logback-spring.xml 多环境配置
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
<springProfile name="dev,test">
<logger name="top.yueshushu" level="DEBUG" additivity="false">
<!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="CONSOLE"/>
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
</springProfile>
<!-- 生产环境 -->
<springProfile name="prod">
<logger name="top.yueshushu" level="DEBUG" additivity="false">
<!-- 生产环境,不打印到控制台 -->
<appender-ref ref="ASYNC_STOCK_FILE" />
<!-- <appender-ref ref="CONSOLE"/>-->
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
</springProfile>
也可以这样配置
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
<logger name="top.yueshushu" level="DEBUG" additivity="false">
<!--不向上传递, 指定 异步文件, 控制台, warn文件, error 文件-->
<springProfile name="dev,test">
<appender-ref ref="CONSOLE"/>
</springProfile>
<appender-ref ref="ASYNC_STOCK_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
当配置文件为 dev 和 test 时,在控制台会打印输出。 为 prod 时,在控制台不会打印
建议使用第二种方式
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/SpringBoot_Log
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!