springboot中logback的配置
在springboot中默认使用的日志就是logback,默认配置一般是够用了,但如果还想更加详细的配置就需要使用我们重新配置logback了。
使用springboot配置logback
这种是只使用springboot提供的application.properties
来配置logback。
以下配置大多为默认配置
logging:
file:
#生成的文件最多存留多久
max-history: 30
#生成的文件最大大小
max-size: 100MB
#日志文件存储路径
path: ./logs/${spring.application.name}
#是否在系统重启时清空日志文件里的内容
clean-history-on-start: false
#日志文件名,在当前文件夹内生成,与logging.file.path使用其一即可
# name: ${spring.application.name}.log
#生成的总日志文件大小
total-size-cap: 10GB
#日志级别
level:
#总级别
root: info
#特殊包的级别
org.apache.ibatis: debug
pattern:
rolling-file-name: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
console: %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}
file: '%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}'
dateformat: yyyy-MM-dd HH:mm:ss.SSS
level: %5p
使用logback配置文件
logback给我们提供了四种配置文件
- logback.xml
- logback-spring.xml
- logback.groovy
- logback-spring.groovy
logback配置在springboot中的加载顺序是logback.xml
->application.properties
->logback-spring.xml
在logback-spring.xml
中我们可以使用Spring里配置,所以推荐使用这种方式来配置logback。
下面我提供两种可用于生产环境的配置,看你们的使用习惯来选择
所有级别日志在同一个文件内出现
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 由于系统刚启动时还未加载application配置,因此最好配置默认值 -->
<contextName>${APP_NAME}</contextName>
<springProperty name="APP_NAME" scope="context" source="spring.application.name" defaultValue="log-demo"/>
<springProperty name="LOG_FILE" scope="context" source="logging.file.path" defaultValue="./logs/${APP_NAME}"/>
<springProperty name="LOG_MAX_FILE_SIZE" scope="context" source="logging.max-size" defaultValue="100MB"/>
<springProperty name="LOG_MAX_FILE_DAY" scope="context" source="logging.file.max-history" defaultValue="30"/>
<springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
<springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>
<springProperty name="TotalSizeCap" scope="context" source="logging.file.total-size-cap" defaultValue="5GB"/>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<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"/>
<!-- 彩色日志格式 -->
<!--格式化输出:%X的内容需要自己在项目内添加(比如拦截器内等),%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%PID进程号,%logger{36}表示类路径仅显示36个字符,%M表示方法名,%line表示输出行号,%m:日志消息,%n是换行符-->
<property name="CONSOLE_LOG_PATTERN"
value=" [${APP_NAME}:${ServerIP}:${ServerPort}] [%clr(%X{traceId}){yellow},%clr(%X{X-B3-TraceId}){yellow}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger{36}#%M){cyan} %clr([line-%line]){red} - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 正常颜色日志格式 -->
<property name="CONSOLE_LOG_PATTERN_NO_COLOR"
value=" [${APP_NAME}:${ServerIP}:${ServerPort}] [%X{traceId},%X{X-B3-TraceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%thread] %logger{36}#%M [line-%line] - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- Console 输出设置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_FILE}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<!--保留时间,单位:天-->
<maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
<!-- 保留的总文件的最大大小 -->
<totalSizeCap>${TotalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 异步输出 -->
<appender name="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 name="dev,test">
<root level="INFO">
<appender-ref ref="ASYNC"/>
<appender-ref ref="CONSOLE"/>
</root>
<logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.bennett.demo" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<root level="WARN">
<appender-ref ref="ASYNC"/>
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
</configuration>
每个级别日志单独存储
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>${APP_NAME}</contextName>
<springProperty name="APP_NAME" scope="context" source="spring.application.name" defaultValue="log-demo"/>
<springProperty name="LOG_FILE" scope="context" source="logging.file.path" defaultValue="./logs/${APP_NAME}"/>
<springProperty name="LOG_MAX_FILE_SIZE" scope="context" source="logging.max-size" defaultValue="100MB"/>
<springProperty name="LOG_MAX_FILE_DAY" scope="context" source="logging.file.max-history" defaultValue="30"/>
<springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
<springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>
<springProperty name="TotalSizeCap" scope="context" source="logging.file.total-size-cap" defaultValue="5GB"/>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<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="[${APP_NAME}:${ServerIP}:${ServerPort}] [%clr(%X{traceId}){yellow},%clr(%X{X-B3-TraceId}){yellow}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger{36}#%M){cyan} %clr([line-%line]){red} - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 正常颜色日志格式 -->
<property name="CONSOLE_LOG_PATTERN_NO_COLOR"
value="[${APP_NAME}:${ServerIP}:${ServerPort}] [%X{traceId},%X{X-B3-TraceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%thread] %logger{36}#%M [line-%line] - %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 控制台日志 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 按照每天生成常规日志文件 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}/${APP_NAME}-error.log</file>
<!-- 基于时间的分包策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<!--保留时间,单位:天-->
<maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
<!-- 保留的总文件的最大大小 -->
<totalSizeCap>${TotalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
<charset>UTF-8</charset>
</encoder>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>${LOG_MAX_FILE_SIZE}</MaxFileSize>
</triggeringPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 按照每天生成常规日志文件 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}/${APP_NAME}-info.log</file>
<!-- 基于时间的分包策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}/${APP_NAME}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<!--保留时间,单位:天-->
<maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
<!-- 保留的总文件的最大大小 -->
<totalSizeCap>${TotalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 按照每天生成常规日志文件 -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}/${APP_NAME}-debug.log</file>
<!-- 基于时间的分包策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}/${APP_NAME}-debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<!--保留时间,单位:天-->
<maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
<!-- 保留的总文件的最大大小 -->
<totalSizeCap>${TotalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 按照每天生成常规日志文件 -->
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}/${APP_NAME}-warn.log</file>
<!-- 基于时间的分包策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}/${APP_NAME}-warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${LOG_MAX_FILE_SIZE}</maxFileSize>
<!--保留时间,单位:天-->
<maxHistory>${LOG_MAX_FILE_DAY}</maxHistory>
<!-- 保留的总文件的最大大小 -->
<totalSizeCap>${TotalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN_NO_COLOR}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志.设为0可保存全部-->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="ERROR"/>
</appender>
<appender name="ASYNC-WARN" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<appender-ref ref="WARN"/>
</appender>
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<appender-ref ref="INFO"/>
</appender>
<appender name="ASYNC-DEBUG" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<appender-ref ref="DEBUG"/>
</appender>
<springProfile name="dev,test">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC-ERROR"/>
<appender-ref ref="ASYNC-WARN"/>
<appender-ref ref="ASYNC-INFO"/>
<appender-ref ref="ASYNC-DEBUG"/>
</root>
<logger name="com.bennett.demo" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<root level="WARN">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ERROR"/>
<appender-ref ref="WARN"/>
<appender-ref ref="INFO"/>
<appender-ref ref="DEBUG"/>
</root>
</springProfile>
</configuration>
如果有什么疑问,好的建议欢迎在评论区留言!