引言
自定义日志配置
根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:
- Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
- Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
- Log4j2:log4j2-spring.xml, log4j2.xml
- JDK (Java Util Logging):logging.properties
日志级别
日志级别从高到低:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
如果设置为 WARN ,则低于 WARN 的信息都不会输出。
这里我们介绍Spring Boot 整合 Logback的方式
Logback是由log4j创始人设计的又一个开源日志组件。
logback是springboot默认的日志组件
一、项目结构
二、Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
三、TestController
package com.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@GetMapping("/test")
public void test() {
for (int i = 0; i < 2000; i++) {
log.error("hello");
log.info("hello");
}
}
}
四、Logback配置文件logback-spring.xml
模板如下,更具自己项目情况适当修改
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--日志输出路径-->
<property name="LOG_HOME" value="/data/logging/logs"/>
<!--控制台日志输出配置-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--对输出日志进行格式化-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--此处设置字符集-->
<charset>UTF-8</charset>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} (%file:%line\) [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--日志文件配置info-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
所以我们使用下面的策略,可以避免输出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤 Error-->
<level>ERROR</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/system_info.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<MaxHistory>5</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--日志文件配置error-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--设置日志级别,过滤掉info日志,只输入error日志-->
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/system_error.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<MaxHistory>1</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<!--指定最基础的日志输出级别-->
<root level="INFO">
<appender-ref ref="consoleLog"/>
</root>
<!--name 扫描包的位置-->
<logger name="com.demo" level="INFO">
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</logger>
</configuration>
多环境日志输出
<configuration>
...
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
<springProfile name="test,dev">
<logger name="springboot.log.demo.controller" level="DEBUG" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>
</springProfile>
<!-- 生产环境. -->
<springProfile name="prod">
<logger name="springboot.log.demo.controller" level="INFO" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>
</springProfile>
</configuration>
当application.yml设置环境为test时,激活log为test配置;设置为prod时,激活log配置为prod配置:
spring:
profiles:
active: test
<encoder>
表示对日志进行编码:
- %d{HH: mm:ss.SSS}——日志输出时间
- %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
- %-5level——日志级别,并且使用5个字符靠左对齐
- %logger{36}——日志输出者的名字
- %msg——日志消息
- %n——平台的换行符
- ThresholdFilter为系统定义的拦截器,例如:我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中,可以保证文件里只有Error级别日志。
效果
IDEA设置logback配置文件路径
--logging.config=classpath:logback-config.xml