企业级日志配置

springboot2.0.2作为项目架构,日志输出是项目重点项之一,优雅的日志打印给人一种赏心悦目的感觉
线上项目应该完美打印日志,并将日志隔离,易于区分日志种类,方便查找日志内容

pom.xml

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--log-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-parent</artifactId>
<version>1.2.3</version>
<type>pom</type>
</dependency>

application.properties

#log
logging.config=classpath:logback-spring.xml

logback-spring.xml

下面日志的优点在于,日志横向,纵向分级别输出。横向输出为日志debug,info,warn,error级别隔离输出,纵向以时间为单位每日生成新的日子文件。方便开发,支持人员定位问题,减少日志查找事件,定期日志导出备份,保存6个月左右,以防用户翻阅问题。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!-- set env -->
<property name="LOGDROOT" value="${catalina.home}"/><!--tomcat目录-->
<property name="APP_NAME" value="XM"/><!--项目名称-->
<!--日志路径-->
<property name="DEBUG_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_debug"/>
<property name="INFO_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_info"/>
<property name="WARN_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_warn"/>
<property name="ERROR_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_error"/>
<property name="DAY_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}"/>
<!--日志输出格式-->
<property name="LOG_PATTERN_CONSOLE"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] [%X{traceId}] %m%n"/>
<property name="LOG_PATTERN_FILE"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] [%X{traceId}] %m%n"/>
<property name="CALC_BILL_LOG_PATTERN_FILE" value="%m%n"/>
<!--可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,删除之前的旧文件-->
<property name="MAXHISTORY" value="30"/>
<!--设置日志存储最大值-->
<property name="MAXFILESIZE" value="500MB"/>

<!-- 性能相关 -->
<property name="PERF_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_perf"/>

<!-- set context name -->
<contextName>${APP_NAME}</contextName>

<!-- console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_CONSOLE}</pattern>
</encoder>
</appender>

<!-- debug level -->
<appender name="debug"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- file name -->
<File>${DEBUG_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--output file name -->
<fileNamePattern>${DEBUG_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<!-- MAXHISTORY days old files will be delete -->
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- info level -->
<appender name="info"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${INFO_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- warn level -->
<appender name="warn"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${WARN_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${WARN_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- error level -->
<appender name="error"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${ERROR_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ERROR_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- 每日输出 -->
<appender name="day_log"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${DAY_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${DAY_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
</appender>

<!-- 异步输出 -->
<appender name="dayLogAsyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<includeCallerData>true</includeCallerData>
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<appender-ref ref="day_log"/>
</appender>

<!-- spring -->
<logger name="org.springframework" level="info"/>

<logger name="com.dome" level="info" additivity="false">
<appender-ref ref="error"/>
<appender-ref ref="warn"/>
<appender-ref ref="console"/>
</logger>

<!-- lookback -->
<logger name="lookbackLogger" level="info" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="lookbackAppender"/>
</logger>
<!-- root -->
<root level="info">
<appender-ref ref="info"/>
<appender-ref ref="warn"/>
<appender-ref ref="error"/>
<appender-ref ref="console"/>
</root>
</configuration>