Spring Boot日志

目录

1.日志的作用

2.自定义打印日志

3.日志级别

4.日志持久化

5.使用lombok输出日志


1.日志的作用

日志是程序的重要组成部分,其实我们几乎无时无刻都在接触日志。简单的说它其实就是程序运行过程中产生的信息。它的主要作用就是帮助程序猿根据日志信息去定位错误并把它修复。试想如果没有日志信息,那么我们只能凭借自己的经验去修复bug,这无疑是非常低效的。

比如当我们启动SpringBoot时,控制台打印的信息就是日志

 除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:

记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。

记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。

记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。

2.自定义日志打印 

2.1 实现步骤

1.获得日志对象
注意:日志对象Logger 属于org.slf4j包下的,不要导错包

2.使用日志对象打印日志


具体实现可参考下面代码:

@Service
public class UserService {
    //1.获得日志对象
    @Autowired
    private static final Logger log= 
        LoggerFactory.getLogger(UserService.class);

    @PostConstruct
    public void UserService(){
        //2.自定义打印日志
        log.trace("trace 日志");
        log.debug("debug 日志");
        log.info("info 日志");
        log.warn("warn 日志");
        log.error("error 日志");
    }

}

打印结果如下,大家可能会发现我们trace和debug日志并没有被打印,这涉及到有关日志级别的问题,我们会在下面解释。 

在程序中获取⽇志对象需要使用日志工厂 LoggerFactory,日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定位到问题类。


而我们打印日志时的trace,debug等就是我们日志的级别,这个我们下面会提到。

2.2 日志格式说明 

Spring Boot日志_第1张图片

 2.3 常见的日志框架说明

Spring Boot日志_第2张图片

 上面这张图其实就解释了为什么我们需要导入org.slf4j这个包。因为Spring Boot日志框架slf4j实际上采用了“门面模式”。我们所有对日志的操作都是经过slf4j这个接口去调用底层的日志实现来完成的。而这样做的好处就是将底层与上层隔离,我们只需要关注上层的操作,当出现了更优秀的日志底层实现我们也能够及时更换而不影响上层的代码。

1.日志框架包括日志门面、日志实现

2.日志门面就相当于是装修公司,日志实现相当于是工程队(实现具体的操作),日志门面仅能对应一个日志实现

3.日志级别

3.1 日志级别的作用

日志的级别就是为了筛选符合目标的日志信息的。有了日志级别之后就可以过滤自己想看到的信息了,比如设置日志级别为 error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者的信息筛选时间。

而这也就解释了为什么 我们之前的打印日志的代码trace和debug日志并没有被打印,因为Spring Boot默认的日志级别是info,低于此级别的日志都不会被打印。

3.2 日志级别的分类与使用

日志的级别分为:

trace:微量,少许的意思,级别最低;

debug:需要调试时候的关键信息打印;

info:普通的打印信息;

warn:警告,不影响使⽤,但需要注意的问题;

error:错误信息,级别较⾼的错误⽇志信息;

fatal:致命的,因为代码异常导致程序退出执⾏的事件。(此级别日志只能由系统自行打印)

日志级别的顺序:

Spring Boot日志_第3张图片

越往上接收到的消息就越少。

日志使用:

 日志级别配置只需要在配置⽂件中设置“logging.level”配置项即可,如下所示:

#yml

logging:
 level:
   root: error

#properties

logging.level.root=error

注意:

1.root项代表设置日志级别的范围,root代表全局日志级别

2.当存在局部日志级别和全局日志级别时,局部日志级别优先级>全局日志级别优先级

 4.日志持久化

以上的日志都是输出在控制台上的,然而在⽣产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。

想要将日志进⾏持久化,只需要在配置⽂件中指定日志的存储目录或者是指定日志保存文件名之后, Spring Boot 就会将控制台的日志写到相应的⽬录或⽂件下了。

配置日志文件的保存路径:

logging.file.name=D:/Data/

 注意:这里我们使用的是"/"而不是"\"。虽然Windows使用的是后者,但是它同样支持前者,并且由于Linux使用的也是前者,我们的系统大多也都会部署在Linux上,所以我们会使用"/"。但最主要的原因其实是"\"会被识别成转义字符导致Spring Boot无法识别正确路径而报错。

Spring Boot日志_第4张图片 

 如果我们真的想使用"\"我们也可以再它的前面再加一个"\"来转义,这样Spring Boot就可以正确识别出"\"(不推荐)。

注意:如果日志的内容过大,超过日志文件的容量,系统自动设置另一个日志文件保存

5.使用lombok输出日志

每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,这⾥讲⼀ 种更好用的日志输出⽅式——使用 lombok 来更简单的输出。

在使用前我们需要执行以下步骤:
1. 添加 lombok 框架⽀持。

2. 使⽤ @slf4j 注解输出⽇志。

5.1 添加lombok依赖 

这里我们一般在创建项目时就会添加,见下图:
Spring Boot日志_第5张图片

如果我们忘记添加也可以通过插件在项目内来快捷修改,这里我们需要安装EditStarters插件

Spring Boot日志_第6张图片

 安装好后在pom.xml页面内右键选择”生成“

Spring Boot日志_第7张图片

 选择该插件即可

Spring Boot日志_第8张图片

 之后进入这个界面我们就可以去配置项目依赖了

Spring Boot日志_第9张图片

 5.2 输出日志

@Controller
@Slf4j
public class UserController {

    @PostConstruct
    public void UserController(){
        log.trace("trace 日志");
        log.debug("debug 日志");
        log.info("info 日志");
        log.warn("warn 日志");
        log.error("error 日志");
    }
}

 可以看到我们实际上就是将获取日志对象这一重复繁琐的步骤换成了添加@Slf4j 注解。

注意:使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊日志,并且只能使用 log 对象才能输出,这是 lombok 提供的对象名。 

5.3 lombok 原理解释 

从直观感受来说,似乎就是@Slf4j 注解替换了获取日志对象的语句,其实事实确实如此。我们通过查看target目录来验证。target 为项目最终执⾏的代码,查看 target ⽬录如 下:

Spring Boot日志_第10张图片

对比源文件:

Spring Boot日志_第11张图片

 lombok的原理:lombok通过遵循Java编译器增强的规范,实现了Java源代码在生成字节码的时候功能的增强
@Slf4j注解的作用:IDEA编译源代码的时候,根据注解声明,在字节码文件中自动添加了一段 创建日志对象 的代码

Spring Boot日志_第12张图片

 5.4 lombok 更多注解说明

搞明白了@Slf4j注解的作用,下面那些lombok下的注解我们应该也能够理解他们的作用和原理了

Spring Boot日志_第13张图片

 

你可能感兴趣的:(spring,boot,java,spring)