springboot本身就继承了logback,但是想要输出日志还是需要各种配置(日志切分、格式、异步等),这种做下简单的总结。
一、配置文件
在resource下创建logback-spring.xml文件
使用springProperty标签
<springProperty scope="context" name="LOG_HOME" source="log.path" defaultValue="./logs"/>
<springProperty>
与Logback的标准 <property>
标签类似,根据source在对应文件加载配置。如果没有设置该属性的值,默认使用defaultValue。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志文件编码 -->
<property name="LOG_CHARSET" value="UTF-8"/>
<!-- 日志文件路径 -->
<property name="LOG_DIR" value="${LOG_HOME}"/>
<!-- 日志根目录 -->
<springProperty scope="context" name="LOG_HOME" source="log.path" defaultValue="./logs"/>
<!-- 日志文件名称 -->
<springProperty scope="context" name="LOG_ROOT_LEVEL" source="log.root.level" defaultValue="INFO"/>
<!-- 是否输出到控制台 -->
<springProperty scope="context" name="LOG_STDOUT" source="log.stdout" defaultValue="false"/>
<!-- 配置日志的滚动时间按小时滚动,默认保留3天 -->
<springProperty scope="context" name="MAX_HISTORY_BIZ_HOUR" source="log.maxHistory.biz.hour" defaultValue="72"/>
<springProperty scope="context" name="MAX_HISTORY_ERROR_HOUR" source="log.maxHistory.error.hour" defaultValue="72"/>
<springProperty scope="context" name="MAX_HISTORY_DEBUG_HOUR" source="log.maxHistory.debug.hour" defaultValue="72"/>
<springProperty scope="context" name="MAX_SIZE_CAP_VALUE" source="log.max.size.cap" defaultValue="4GB"/>
<!--日志格式化 -->
<property name="LOG_MSG"
value="%level %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread %logger{36}] %msg%n"/>
<property name="MAX_HISTORY_BIZ" value="${MAX_HISTORY_BIZ_HOUR}"/>
<property name="MAX_HISTORY_ERROR" value="${MAX_HISTORY_ERROR_HOUR}"/>
<property name="MAX_HISTORY_DEBUG" value="${MAX_HISTORY_DEBUG_HOUR}"/>
<property name="MAX_SIZE_CAP" value="${MAX_SIZE_CAP_VALUE}"/>
<!--输出到控制台 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!-- 下面为配置只输出INFO以及其之下级别的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<!-- 输出的日志内容格式化 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_MSG}</pattern>
</layout>
</appender>
<!-- 定义 DEBUG 日志的输出方式: -->
<appender name="FILE_DEBUG"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 下面为配置只输出DEBUG级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<OnMismatch>DENY</OnMismatch>
<OnMatch>ACCEPT</OnMatch>
</filter>
<!--日志文件路径,日志文件名称 -->
<File>${LOG_DIR}/debug.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/debug.log.%d{yyyyMMddHH}
</fileNamePattern>
<maxHistory>${MAX_HISTORY_DEBUG}</maxHistory>
<totalSizeCap>${MAX_SIZE_CAP}</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<!-- 输出的日志内容格式化 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_MSG}</pattern>
</layout>
</appender>
<appender name="FILE_BIZ"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 下面为配置只输出INFO以及其之下级别的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<!--日志文件路径,日志文件名称 -->
<File>${LOG_DIR}/biz.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/biz.log.%d{yyyyMMddHH}
</fileNamePattern>
<maxHistory>${MAX_HISTORY_BIZ}</maxHistory>
<totalSizeCap>${MAX_SIZE_CAP}</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<!-- 输出的日志内容格式化 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_MSG}</pattern>
</layout>
</appender>
<!-- 定义 ERROR 日志的输出方式: -->
<appender name="FILE_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 下面为配置只输出error级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<OnMismatch>DENY</OnMismatch>
<OnMatch>ACCEPT</OnMatch>
</filter>
<!--日志文件路径,日志文件名称 -->
<File>${LOG_DIR}/err.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/err.log.%d{yyyyMMddHH}
</fileNamePattern>
<maxHistory>${MAX_HISTORY_ERROR}</maxHistory>
<totalSizeCap>${MAX_SIZE_CAP}</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<!-- 输出的日志内容格式化 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>${LOG_MSG}</Pattern>
</layout>
</appender>
<!-- 异步日志 -->
<appender name="ASYNC_FILE_BIZ"
class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="FILE_BIZ"/>
</appender>
<!--DEBUG -->
<appender name="ASYNC_FILE_DEBUG"
class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="FILE_DEBUG"/>
</appender>
<!-- ERROR -->
<appender name="ASYNC_FILE_ERROR"
class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="FILE_ERROR"/>
</appender>
<!-- ${LOG_ROOT_LEVEL} 日志级别 -->
<root level="${LOG_ROOT_LEVEL}">
<if condition='property("LOG_STDOUT").equals("true")'>
<then>
<appender-ref ref="STDOUT"/>
</then>
</if>
<appender-ref ref="ASYNC_FILE_DEBUG"/>
<appender-ref ref="ASYNC_FILE_BIZ"/>
<appender-ref ref="ASYNC_FILE_ERROR"/>
</root>
</configuration>
二、说明
logback配置有几点需要注意的
1)生产环境不要输出控制台日志
2)建议异步输出日志,可以极大的提高性能。
3)最好不要打印行号,对性能影响不小
4)如果可能尽量缩短日志长度