项目打印日志能帮助我们解决很多的问题,提示我们出现的问题,通过日志我们可以准确的定位问题快速找到问题点解决问题。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="30 seconds">
<!-- 彩色日志依赖 -->
<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"/>
<!-- 日志文件储存地址, 通过application配置文件传入 -->
<!-- <springProperty scope="context" name="LOG_PATH" source="logback.logDir" />-->
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_PATH" value="./logs"/>
<springProperty scope="context" name="LOG_NAME" source="spring.application.name"/>
<!-- 控制台彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 日志文件日志格式 -->
<property name="FILE_LOG_PATTERN"
value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 按照每天及大小生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_PATH}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件最大大小-->
<maxFileSize>100MB</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 过滤级别,
如果想分类生成日志文件的话(分成debug、info、error等三个日志文件, 每个文件只记录自己级别的日志),
1. 直接把这个 <appender> 复制三分改一下 FileNamePattern 和 name.
2. 把 <filter> 注释去掉改一下 level 就可以了
-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>info</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
</appender>
<!--配置异步日志-->
<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!--不丢失日志,默认的,如果队列的80%已满 则会丢弃TRACT,DEBUG,INFO级别的日志-->
<discardingThreshold>0</discardingThreshold>
<!--更改默认的队列的深度,改值会影响性能,默认值是256-->
<queueSize>512</queueSize>
<!--添加附加的appender,最多只能添加一个-->
<appender-ref ref="FILE"/>
</appender>
<!-- 日志输出级别
如果使用springProfile, 就需要在application配置文件中通过 spring.profiles.active=dev 来指定环境,
也可以直接去掉 <springProfile> 这个标签或者把它整个注释掉
-->
<springProfile name="gzl,prod">
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!--项目包的路径-->
<logger name="com.gzl.oms.mapper" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="com.gzl.common" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<!--包-->
<!--<logger name="com.gzl.base.mapper" level="OFF"></logger>-->
<!--类-->
<!--<logger name="com.gzl.base.mapper.UserMapper." level="OFF"></logger>-->
<!--方法-->
<!--<logger name="com.gzl.base.controller.UserController.selectUserRoleAuthority" level="OFF"></logger>-->
<!--不打印某个类下的日志-->
<!-- <logger name="com.gzl.base.mapper.ProductInfoMapper" level="OFF"/>-->
</springProfile>
</configuration>
打印日志的时候没有打印线程id 解决方案是添加线程id
[%X{trackID}]
比如
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{trackID}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 日志文件日志格式 -->
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} [%X{trackID}] [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
不是一个项目的配置问题 可能会有差异。
还有一个方法是添加引用链路追踪,用的是springcloud不需要添加引用版本号
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
然后在配置文件中开启配置
spring:
sleuth:
enabled: true
这时候你能看到打印的线程id
有了线程id我们能完整看到一个方法调用的全链路打印日志,对处理问题很有帮助