相关系列文章
前言
SLF4J官网地址 : https://www.slf4j.org/
SLF4J, 简单的的日志门面(Simple Logging Facade for Java), 官方说是可以用作各种日志框架(如java.util.loggiong logback log4j)的简单外观或抽象, 允许最终用户在部署时插入所需的日志框架, 简单理解和JDBC原理差不多, JDBC不关心具体的数据库实现, SLF4J也不关心具体日志框架实现
为什么用SLF4J
低耦合: 不关心具体的日志实现框架, 可以不改代码下, 修改日志框架实现
作用范围广: 它可以在代码中添加一些输出日志的语句, 使得这些日志可以输出到控制台, 或文件, 甚至数据库中
灵活输出: 可以定义日志级别, 在项目中, 灵活调配日志输出级别, 实现信息输出
提示:以下是本篇文章正文内容,下面案例可供参考
一、引入SLF4J
在Spring Boot项目中, Spring-boot-starter
中已经集成了日志的依赖项, 是可以直接使用, 在使用时还需要添加Lombok依赖, 下载Lombok插件 跳转, 简化代码的Lombok
Lombok依赖(在SpringBoot创建时勾选Lombok, 依赖会自动导入)
<!-- lombok依赖包 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
如图: 是创建Spring Boot项目后, 自动整合的SLF4J依赖
可以看到
SpringBoot
中默认使用的日志实现是logback
框架
二、日志级别
在SLF4J日志框架中, 会将日志的重要程度分为几个级别, 常用级别中, 从不重要到重要, 依次是:
- trace : 跟踪
- debug : 调试
- info : 一般信息
- warn : 警告
- error : 错误
在开发中, 应该根据要输出的内容敏感的程度, 重要性来选择调用某个方法, 以输出对应级别的日志, 如涉及关键数据应该使用
trace
或debug
级别, 这样当交付项目是, 将设置日志显示级别的配置删除, 或显示的配置为info
级别, 则trace
、debug
级别的日志都不会被输出
例如: 设置项目日志显示级别
在
application.properties
中添加配置, 用于控制日志输出级别,logging.level
后面跟的是包名, 配置的是根包, 配置后此包及其子孙包都会应用此配置, 包名设置完=
右边设置显示级别
# SLF4J设置日志的显示级别
logging.level.cn.qingtian.slf4j=trace
在配置日志显示级别时 :
- 当显示级别为
info
时, 只会显示info
warn
error
- 当显示级别为
debug
时, 只会显示debug
info
warn
error
- 当显示级别为
trace
时, 会显示所有级别的日志
三、控制台输出
调用日志, 需要在日志输出类上添加@SLF4J
注解, 只有被此注解标注的类, 类中才能调用log
方法, 设置日志级别
例如: 在cn.qingtian.slf4j.controller包下创建UserController类
package cn.qingtian.slf4j.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
// 获取用户的请求
@GetMapping("/get")
public String getUser(){
log.debug("[用户控制器]开始获取用户数据");
String user = "username=jerry,password=123456";
log.debug("[用户控制器]已经获取到用户数据user={}",user);
log.info("[用户控制器]已处理获取用户的请求");
return user;
}
// 各级别日志的输出
@GetMapping("/log")
public void log(){
log.trace("[trace]级别日志,执行类: {},执行方法: {}",this.getClass().getName(),"log");
log.debug("[debug]级别日志,执行类: {},执行方法: {}",this.getClass().getName(),"log");
log.info("[info]级别日志,执行类: {},执行方法: {}",this.getClass().getName(),"log");
log.warn("[warn]级别日志,执行类: {},执行方法: {}",this.getClass().getName(),"log");
log.error("[error]级别日志,执行类: {},执行方法: {}",this.getClass().getName(),"log");
}
}
关于输出日志的方法, 都是被重载了很多次, 如果只输出1个字符串, 应该使用
public void debug(String msg);
如果这个字符串需要拼接多个变量的值, 应该使用
public void debug(String format, Object... arguments);
例如:
log.debug("以获取到数据, 数据={}",data);
以上使用此方法拼接字符串, 会缓存、预编译字符串, 再将值带入去执行, 所以执行效率远高于
System.out.println()
的输出语句
四、本地输出
在项目配置文件application.properties
中写入:
# SLF4J设置日志的显示级别
logging.level.cn.qingtian.slf4j=trace
# SLF4J设置日志输出到文件, 此处必须写绝对路径, 如果文件不存在会自动创建(包括目录不存在也会自动创建)
logging.file.name=D:/sql1/Slf4j-log.txt
SLF4J设置日志输出到文件, 此处必须写绝对路径, 如果文件不存在会自动创建(包括目录不存在也会自动创建)
五、效果演示
项目目录结构
启动项目, 此时日志显示级别为trace, 在浏览器中分别访问
http://localhost:8080/user/get
和http://localhost:8080/user/log
控制台输出为:
本地日志文件为:
再次启动项目, 设置日志显示级别为info, 在浏览器中分别访问
http://localhost:8080/user/get
和http://localhost:8080/user/log
控制台输出为:
本地日志文件为: