导图社区 Spring日志
详细介绍Spring日志相关知识:包含logging,SLF4J(Simple logging Facade for Java),如果文件不存在,则查找文件logback.xml,如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台等等
编辑于2022-04-18 16:46:18Spring基础 高级功能详解,如 additional-spring-configuration-metadata.json将会合并到spring-configuration-metadata.json中,并覆盖掉相同的说明。
敏捷开发相关的理论知识--Scrum,我们的最高目标是通过尽早和持续第交付有价值的软件来满足客户;欢迎对需求提出变更 - 即使在项目开发后期,要善于利用需求变更,帮助客户获得竞争优势;
这是一篇关于Dockerfile的思维导图,主要内容有FROM、MAINTAINER、LABEL、COPY、ADD、EXPOSE、ENV、ARG。
社区模板帮助中心,点此进入>>
Spring基础 高级功能详解,如 additional-spring-configuration-metadata.json将会合并到spring-configuration-metadata.json中,并覆盖掉相同的说明。
敏捷开发相关的理论知识--Scrum,我们的最高目标是通过尽早和持续第交付有价值的软件来满足客户;欢迎对需求提出变更 - 即使在项目开发后期,要善于利用需求变更,帮助客户获得竞争优势;
这是一篇关于Dockerfile的思维导图,主要内容有FROM、MAINTAINER、LABEL、COPY、ADD、EXPOSE、ENV、ARG。
日志
https://www.jianshu.com/p/7029bc605db4 https://blog.csdn.net/shijianjinghun/article/details/112308763
logging
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
SLF4J(Simple logging Facade for Java)
意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j,logback,java.util.logging等,它们才实现了具体的日志系统的功能。 他只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口,并没有实现
Logback(默认)
logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现(即直接实现了slf4j的接口,而log4j并没有直接实现,所以就需要一个适配器slf4j-log4j12.jar)
配置文件
logback-spring.xml
logback-spring.groovy
logback.xml
logback.groovy
查找配置文件
尝试在 classpath下查找文件logback-test.xml
如果文件不存在,则查找文件logback.xml
如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台
Log4J
配置文件
log4j-spring.properties
log4j-spring.xml
log4j.properties
log4j.xml
Log4J2(Log4J的升级款)
配置文件
log4j2-spring.xml
log4j2.xml
概要
推荐优先使用带有 -spring 的文件
application.yml 可以通过 logging.config 属性指定自定义的名字
logging.config=classpath:logging-config.xml
SpringBoot选用的是SLF4J和logback
JDK (Java Util Logging)
配置文件
logging.properties
级别
TRACE
DEBUG
INFO
WARN
ERROR
输出
目标
文本文件
关系型数据库
No Sql
Console 控制台
内容
时间日期
精确到毫秒
日志级别
进程ID
分隔符
线程名
方括号括起来(可能会截断控制台输出)
Logger名
通常使用源代码的类名
日志内容
格式
特殊符号
%d
日期
%thread
线程名
%-5level
级别从左显示5个字符宽度
%msg
日志消息
%n
换行符
占位输出
{}
log.info("hello,arg={}","world");
源码
ch.qos.logback.classic.PatternLayout
工具
MDC
自定义日志
Appender
Layout
MDCConverter
实例
1
<configuration> <contextListener class="com.ofpay.logback.TtlMdcListener"/> <!-- 直接本配置文件配置,name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。java.io.tmpdir的值从虚拟机参数中获取:-Djava.io.tmpdir --> <property name="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/> <!-- properties配置文件定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径。source配置文件内参数key --> <springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="spring-boot-fusion"/> <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}——日志输出时间; $PID——进程号; %level——日志级别; ${LOG_LEVEL_PATTERN:-%5p}:用于呈现日志级别的格式(默认%5p);%t--输出日志的线程名;%-40.40logger{39}——其中的“-”表示左对齐,“{39}”表示logger名字最长39个字符,否则按照句点分割; %msg——日志消息; %n——平台的换行符; --> <property name="LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}|${PID:- }|%level|${LOG_LEVEL_PATTERN:-%5p}|%t|%-40.40logger{39}: %msg%n"/> <!-- 标准输出模式 console--> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!-- 对日志进行格式化 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${LOG_PATTERN}</pattern> </encoder> </appender> <!-- 输出模式 file,滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件 --> <appender name="fileDebug" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。--> <file>${LOG_PATH}/${APP_NAME}-debug.log</file> <!--滚动策略 基于时间的分包策略,SizeAndTimeBasedRollingPolicy:按日期,大小记录日志 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- yyyy-MM-dd 时间策略则为一天一个文件,%d{yyyy-MM-dd-HH}指定日期格式,%i指定索引 --> <FileNamePattern>${LOG_PATH}/${APP_NAME}-debug.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern> <!--日志文件保留小时数,此处的时间单位是从fileNamePattern的yyyy-MM-dd_HH中提取的,yyyy-MM-dd_HH精确到小时,因此单位就是小时--> <MaxHistory>48</MaxHistory> <maxFileSize>1GB</maxFileSize> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <!-- layout 负责把事件转换成字符串,格式化的日志信息的输出 --> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_PATTERN}</pattern> </layout> <!-- 过滤策略: LevelFilter : 只打印level标签设置的日志级别 ThresholdFilter:打印大于等于level标签设置的级别,小的舍弃 当前appender=fileDebug只记录debug级别 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--设置过滤级别--> <level>DEBUG</level> <!--用于配置符合过滤条件的操作--> <onMatch>ACCEPT</onMatch> <!--用于配置不符合过滤条件的操作--> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 输出模式 file,滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件 --> <appender name="fileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。--> <file>${LOG_PATH}/${APP_NAME}-info.log</file> <!--滚动策略 基于时间的分包策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 --> <FileNamePattern>${LOG_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern> <!--日志文件保留小时数--> <MaxHistory>48</MaxHistory> <!--单个日志文件最大1GB--> <maxFileSize>1GB</maxFileSize> <!--日志文件总大小超过20GB会删除旧的日志文件--> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <!-- layout 负责把事件转换成字符串,格式化的日志信息的输出 --> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_PATTERN}</pattern> </layout> <!--级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--设置过滤级别--> <level>INFO</level> <!--用于配置符合过滤条件的操作--> <onMatch>ACCEPT</onMatch> <!--用于配置不符合过滤条件的操作--> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="fileWarn" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APP_NAME}-warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 --> <FileNamePattern>${LOG_PATH}/${APP_NAME}-warn.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern> <!--日志文件保留小时数--> <MaxHistory>48</MaxHistory> <maxFileSize>1GB</maxFileSize> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_PATTERN}</pattern> </layout> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="fileError" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APP_NAME}-error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 --> <FileNamePattern>${LOG_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern> <!--日志文件保留小时数--> <MaxHistory>48</MaxHistory> <maxFileSize>1GB</maxFileSize> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_PATTERN}</pattern> </layout> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="fileAccess" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APP_NAME}-access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- yyyy-MM-dd 时间策略则为一天一个文件 --> <FileNamePattern>${LOG_PATH}/${APP_NAME}-access.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern> <!--日志文件保留小时数--> <MaxHistory>48</MaxHistory> <!-- 单个日志文件最大 1GB,总日志量不能超过totalSizeCap--> <maxFileSize>1GB</maxFileSize> <!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 --> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_PATTERN}</pattern> </layout> </appender> <appender name="fileSQL" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APP_NAME}-sql.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- yyyy-MM-dd-HH 时间策略则为一小时一个文件 --> <FileNamePattern>${LOG_PATH}/${APP_NAME}-sql.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern> <MaxHistory>48</MaxHistory> <maxFileSize>1GB</maxFileSize> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_PATTERN}</pattern> </layout> </appender> <appender name="asyncDebug" class="ch.qos.logback.classic.AsyncAppender"> <!-- 默认情况下,当BlockingQueue还有20%容量, 他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。 为了保持所有的events,设置该值为0。--> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>1024</queueSize> <!--如果设置了neverBlock=true则写日志队列时候会调用ArrayBlockingQueue对的offer方法而不是put,而offer是非阻塞的--> <neverBlock>true</neverBlock> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="fileDebug"/> </appender> <appender name="asyncInfo" class="ch.qos.logback.classic.AsyncAppender"> <!-- 默认情况下,当BlockingQueue还有20%容量, 他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。 为了保持所有的events,设置该值为0。--> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>1024</queueSize> <!--如果设置了neverBlock=true则写日志队列时候会调用ArrayBlockingQueue对的offer方法而不是put,而offer是非阻塞的--> <neverBlock>true</neverBlock> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="fileInfo"/> </appender> <appender name="asyncWarn" class="ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>0</discardingThreshold> <queueSize>1024</queueSize> <neverBlock>true</neverBlock> <appender-ref ref="fileWarn"/> </appender> <appender name="asyncError" class="ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>0</discardingThreshold> <queueSize>1024</queueSize> <neverBlock>true</neverBlock> <appender-ref ref="fileError"/> </appender> <appender name="asyncAccess" class="ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>0</discardingThreshold> <queueSize>1024</queueSize> <neverBlock>true</neverBlock> <appender-ref ref="fileAccess"/> </appender> <appender name="asyncSQL" class="ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>0</discardingThreshold> <queueSize>1024</queueSize> <neverBlock>true</neverBlock> <appender-ref ref="fileSQL"/> </appender> <!-- request 日志 additivity: 是否向上级logger传递打印信息。默认是true。 同<logger>一样,可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。 --> <logger name="com.poizon.fusion.webmvc.logging.AccessLoggingFilter" level="info" additivity="false"> <appender-ref ref="asyncAccess"/> </logger> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 --> <logger name="springfox.documentation" level="OFF"/> <!-- springProfile多环境日志输出,根据不同环境(local:本地环境,prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,读取spring.profiles.active的值--> <springProfile name="local"> <root> <level value="DEBUG"/> <appender-ref ref="asyncDebug"/> </root> <root> <level value="INFO"/> <appender-ref ref="stdout"/> <appender-ref ref="asyncInfo"/> <appender-ref ref="asyncWarn"/> <appender-ref ref="asyncError"/> </root> </springProfile> </configuration>
springboot
配置文件
application
logging
path
配置日志文件的路径
file
配置日志文件名,如果该属性不配置,默认文件名为spring.log
level
配置日志级别
root
root级别,即项目的所有日志
类路径
类路径下的日志级别
pattern
定制自己的日志格式
console
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n %d{HH:mm:ss.SSS}——日志输出时间 %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用 %-5level——日志级别,并且使用5个字符靠左对齐 %logger- ——日志输出者的名字 %msg——日志消息 %n——平台的换行符
file
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
xml
命名
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置
logback-spring.xml
注意
xml的加载早于application
configuration
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出
debug
打印出logback内部日志信息,实时查看logback运行状态
默认值为false
scan
配置文件如果发生改变,将会被重新加载
默认值为true
scanPeriod
置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒
默认1分钟
<contextName>
每个logger都关联到logger上下文,默认上下文名称为“default”
可以使用< contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改
通过%contextName来打印日志上下文名称
<include>
resource
<root>
<!--设置项目日志输出级别为INFO--> <root level="INFO"> <appender-ref ref="consoleLog1"/> <appender-ref ref="consoleLog2"/> </root>
指定最基础的日志输出级别,只有一个level属性
必填节点
<logger>
属性
name
用来指定受此logger约束的某一个包或者具体的某一个类
level
用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别
additivity
是否向上级logger传递打印信息。默认是true
是 子Logger 是否继承 root的Logger 的 输出源(appender) 的标志位
appender-ref
属性
ref
标识这个appender将会添加到这个logger
appender
介绍
配置日志输出策略,输出目的地(文件、控制台等)
name
策略名称
class
日志输出目标
类型
ch.qos.logback.core.ConsoleAppender
输出到控制台
子节点
encoder
target
ch.qos.logback.core.rolling.RollingFileAppender
滚动输出到文件
先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件
ch.qos.logback.core.FileAppender
把日志输出到文件
子节点
append
file
encoder
prudent
ch.qos.logback.classic.AsyncAppender
子节点
根据class类型不同,子节点不同
详见属性-class
所有子节点解释
<file>
被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值
<filter>
日志过滤
属性
class
ch.qos.logback.classic.filter.LevelFilter
<level>
指定过滤级别
<onMatch>
匹配到<level>时是否输出
ACCEPT
DENY
<onMismatch>
不匹配到<level>时是否输出
ACCEPT
DENY
概要
如果只有<level>则表示最低级别,高于该级别均输出
实例
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>
只记录debug级别
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter>
记录除了DEBUG级别的其它高于DEBUG的
<rollingPolicy>
日志滚动策略
当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
属性
class
指定具体的策略
ch.qos.logback.core.rolling.TimeBasedRollingPolicy
根据时间制定滚动策略,也负责触发滚动
<fileNamePattern>
占位符
%d{yyyy-MM}
直接使用 %d,默认格式是 yyyy-MM-dd
<file>
通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符
<maxHistory>
保留的归档文件的最大数,超出就删除旧文件
单位
从fileNamePattern的yyyy-MM-dd_HH中提取的,yyyy-MM-dd_HH精确到小时,因此单位就是小时
<maxFileSize>
<totalSizeCap>
<cleanHistoryOnStart>
<timeBasedFileNamingAndTriggeringPolicy>
压缩文件
class
策略
<maxFileSize>
文件最大体量
如100MB
ch.qos.logback.core.rolling.FixedWindowRollingPolicy
FixedWindowRollingPolicy
<minIndex>
窗口索引最小值
<maxIndex>
窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12
<fileNamePattern>
必须包含“%i”
<triggeringPolicy>
告知 RollingFileAppender何时激活滚动
class
ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy
查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动
<maxFileSize>
活动文件的大小
默认值是10MB
<encoder>
日志编码(日志时间转换为字符串)
encoder组件是在0.9.19版本之后才引进来的。在以前的版本中,appender是使用layout(将一个event事件转换成一个字符串),然后使用【java.io.writer】对象将字符串写入到文件中
职责
将一个event事件转换成一组byte数组
将转换后的字节数据输出到文件中
<pattern>
格式化表达式
<charset>
字符集
<layout>
class
class
<layout>(逐渐被淘汰)
仅仅完成了将一个event事件转换成一个字符串这一个功能
不能控制将字符串写出到文件
class
<target>
字符串 System.out 或者 System.err ,默认 System.out
<append>
如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true
<prudent>
示例
每天生成一个日志文件,保存30天的日志文件
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> </configuration>
按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志
<configuration> <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> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> </configuration>
<springProperty>
定义变量+值
值可以取application中的变量值
scope
name
变量的名称
source
application中的key
xx.xx.xx
defaultValue
默认值
<property>
定义变量+值
注入到log的上下文
用“${}”获取变量值
name
变量的名称
value
变量的值
<springProfile>
<!-- springProfile多环境日志输出,根据不同环境(local:本地环境,prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,读取spring.profiles.active的值--> <springProfile name="local"> <root> <level value="DEBUG"/> <appender-ref ref="asyncDebug"/> </root> <root> <level value="INFO"/> <appender-ref ref="stdout"/> <appender-ref ref="asyncInfo"/> <appender-ref ref="asyncWarn"/> <appender-ref ref="asyncError"/> </root> </springProfile>
<timestamp>
<conversionRule>
日志颜色