使用 lombok @Slf4j 注解简化日志功能的引入

介绍了如何使用 lombok @Slf4j 注解简化日志功能的引入, 兼谈了重复性管理的问题.

目录
[隐藏]

在开发过程中, 打印必要的日志是必不可少的一环, 而要打印日志, 在相关的类中就要引入日志相关属性, 在传统上, 一般是通过LoggerFactory.getLogger去实现的:

package net.xiaogd.demo.mybatis.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogDemoController {

    // 自行声明
    private static final Logger log = LoggerFactory.getLogger((LogDemoController.class));

    //...
}

尽管这已经很简洁, 但如果有大量的类要做类似的操作, 还是略显重复, 从 重复性管理 的角度, 我们怎么才能尽量减少这些重复的样板代码呢?

答案就是利用 lombok 的 @Slf4j 注解.

使用 lombok @Slf4j 注解的前提

自然, 在你的项目中首先需要引入 lombok, maven 中增加相关依赖, IDE 也需要做些调整, 安装相关插件, 你可以参考前面的 引入 lombok 简化代码及相关 IDE 设置 进行相关操作, 此处不再赘述.

此外, 相关的日志依赖也是要有的, 如果你已经用旧方式启用了日志, 相关依赖通常都是包含了的, 此处也不再展开详说.

lombok @Slf4j 注解的具体用法

有了 lombok 后, 在类中要引入日志功能就变得很简洁了, 只需要在类的上面添加 @Slf4j 注解即可:

package net.xiaogd.demo.mybatis.controller;

import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class DemoController {
    // ...
}

在这之后, lombok 会为我们注入一个 name 为 log 的日志属性, 在代码中直接使用即可:

package net.xiaogd.demo.mybatis.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class DemoController {

    @GetMapping("/hello")
    public String hello() {
        log.info("enter hello...");
        return "hello rest";
    }
}

注意: 注入变量的缺省名字就是 log.

当然, 这个名字也可以通过lombok.log.fieldName配置去调整, 参考 lombok 官网的相关介绍: https://projectlombok.org/features/configuration 以及 https://projectlombok.org/features/log

一般不建议去调整, 毕竟 log 这个名称最简洁, 敲起来也最方便.

如果你现有代码使用了传统方式, 并且不是用的 log 这个名字, 现在又想调整为使用 @Slf4j 方式, 那么可以先使用 重构(refactor)--重命名(rename) 的方式改名, 然后再引入.

就好比如下你自己声明了Logger log那样:

@RestController
public class LogDemoController {

    // 自行声明
    private static final Logger log = LoggerFactory.getLogger((LogDemoController.class));

    @GetMapping("/hello1")
    public String hello() {
        log.info("enter hello...");
        return "hello rest";
    }
}

如果你自己声明, 则有以下一些问题:

  1. 相关声明麻烦又冗长, 你可能很难记住, 每次要用都要去其它地方拷贝;
  2. 不同的类要根据当前的类名自行调整那个 XXX.class 的值, 如果粗心大意的拷贝而忘记改动还可能带来一些潜在的问题;
  3. 如果错误引入了 LoggerLoggerFactory 接口也会导致一些潜在的问题.

而使用注解的方式就简单多了, 你完全不用操心以上问题.

不停地消除各种重复, 提高效率是我们编码过程中的一种追求, 关于使用 lombok @Slf4j 注解简化日志功能的引入就介绍到此, 更多关于 重复性管理 主题的介绍请参考 重复性管理 .