日志功能需求
- 将关键数据打印在控制台
- 将关键数据打印在文件中
- 日志分类,根据日志不同类型打印到不同文件
- 不同的运行环境,打印不同的日志内容
- 日志自动压缩、自动清理
日志的门面: SLF4J
SLF4J
只是一个门面程序,并不做具体的日志打印功能,需要整合LogBack
、Log4j
等第三方模块。
- commons logging
- jboss logging
官方文档:http://www.slf4j.org/manual.html
测试Hello World
代码语言:javascript复制import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class HelloSpringBoot {
Logger log = LoggerFactory.getLogger(HelloSpringBoot.class);
@RequestMapping("hello")
public String hello(){
log.info("Hello");
return "Hello SpringBoot";
}
}
输出
从上面的代码中我们可以看出,如果项目中需要使用到slf4j做日志输出的话,在每一个类里面都需要定义,过于繁琐,下面我们使用 lombok
插件来实现 slf4j
,可以极大的简化我们的代码量。
在项目 pom
文件中引入 lombok
依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
控制器
代码语言:javascript复制@RestController
@Slf4j
public class HelloSpringBoot {
@RequestMapping("hello")
public String hello(){
log.info("Hello");
return "Hello SpringBoot";
}
}
这里我们只需要在我们的类上引入一个@Slf4j
注解就可以实现slf4j日志输出功能。
自定义配置: LogBack
LogBack 特点
- 更快的实现
- 非常充分测试
- 非常充分文档
- 自动重新加载配置文件
- 自动压缩
- 自动去除旧的日志文件
配置 logback-spring.xml
代码语言:javascript复制线上环境记得修改日志的输出路径
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds" debug="false">
<contextName>logback</contextName>
<!-- 配置日志输出路径(注:放到服务器上后记得更改路径) -->
<property name="log.split.path" value="D:\logs\logback_demo\" />
<!-- 配置日志名称 -->
<property name="log.path" value="logback.log" />
<!-- 配置切割后的debug日志输出路径 -->
<property name="log.debug.path" value="debug" />
<!-- 配置切割后的info日志输出路径 -->
<property name="log.info.path" value="info" />
<!-- 配置切割后的warn日志输出路径 -->
<property name="log.warn.path" value="warn" />
<!-- 配置切割后的error日志输出路径 -->
<property name="log.error.path" value="error" />
<!-- 配置日志文件最大数量 -->
<property name="log.file.max.num" value="30" />
<!-- 配置日志文件大小最大值 -->
<property name="log.file.max.size" value="50MB" />
<!-- 配置总日志文件大小最大值 -->
<property name="log.file.total.max.size" value="2GB" />
<!-- 输出到控制台 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--配置输出日志为彩色-->
<pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) - %cyan(%msg%n)</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 配置debug级别日志 -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.debug.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.debug.path}/log_debug_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置info级别日志 -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.info.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.info.path}/log_info_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置warn级别日志 -->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.warn.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.warn.path}/log_warn_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 配置error级别日志 -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 配置日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 配置日志存放路径 -->
<file>${log.split.path}${log.error.path}/${log.path}</file>
<!-- 配置日志切割器 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 配置日志切割策略:每天切割 -->
<fileNamePattern>${log.split.path}${log.error.path}/log_error_back.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 配置日志数量 -->
<maxHistory>${log.file.max.num}</maxHistory>
<!-- 配置单个日志大小的最大值 -->
<maxFileSize>${log.file.max.size}</maxFileSize>
<!-- 配置总日志大小的最大值 -->
<totalSizeCap>${log.file.total.max.size}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL -->
<root level="info">
<!-- 控制台日志 -->
<appender-ref ref="console" />
<!-- 按级别输出到对应文件 -->
<appender-ref ref="debug" />
<appender-ref ref="info"/>
<appender-ref ref="warn"/>
<appender-ref ref="error" />
</root>
</configuration>
配置 application.yml
代码语言:javascript复制spring:
profiles:
active: dev
logging:
path: D:/demolog # 设置日志储存位置