spring boot 自带多个 log 实现,其中也包括 logback,往往开发中,开发者需要根据环境,对日志有不一样的配置操作,如不希望线上出现 debug 日志,测试环境可以出现 debug 日志等等。
配置方法
由于 spring boot 自带多个 log 实现,首先需要将其余实现排除掉。
若 gradle 管理的项目,添加如下代码:
configurations {
compile.exclude module: 'slf4j-log4j12'
compile.exclude module: 'log4j-over-slf4j'
compile.exclude module: 'slf4j-nop'
compile.exclude module: 'spring-boot-starter-json'
}
如果是 maven 构建的项目,全局排除 spring boot log 有些小麻烦,spring boot 的很多 starter 都包含 spring-boot-starter-logging,它主要包含了 logback、log4j-to-slf4j 及 jul-to-slf4j 的实现,需要排除其余两项,具体如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
在完成了 logback jar 包的正确导入之后,开始配置 logback.xml。
不同环境主要有两种配置方法,一种是每个环境单独一个类似 logback-{env}.xml 文件,另一种是在 logback.xml 文件内部利用 springProfile 标签分开配置。
如上两种方法前提都是服务启动是设置 spring.active.profiles 参数,该选项是指定服务当前的环境,如常用的 local、dev、test、staging 和 prod 等。
第一种方法,spring boot 会根据不同环境加载 logback-{evn}.xml 配置项。
第二种方法,具体示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 控制台日志 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M %L - %msg %n</Pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 文件日志 -->
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M %L - %msg %n</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/file.%d{yyyyMMdd}.log</fileNamePattern>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 错误日志 -->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M %L - %msg %n</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/error.%d{yyyyMMdd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- server log -->
<appender name="serverLogFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>server_log/server_log.%d{yyyyMMdd}.log</fileNamePattern>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<springProfile name="dev,pre,prod">
<logger name="serverLogger" additivity="false">
<appender-ref ref="serverLogFileAppender"/>
</logger>
<root level="INFO">
<appender-ref ref="fileAppender"/>
<appender-ref ref="consoleAppender"/>
<appender-ref ref="errorAppender"/>
</root>
</springProfile>
<springProfile name="local">
<root level="INFO">
<appender-ref ref="consoleAppender"/>
</root>
</springProfile>
</configuration>