如何优雅封装统一日志打印工具类?一文教会你!

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:掘金/C站/腾讯云/阿里云/华为云/51CTO(全网同号);欢迎大家常来逛逛,互相学习。

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

我们都知道一个真相,在开发中,日志记录扮演着极其重要的角色。无论是在开发调试阶段,还是在生产环境中,日志都能够帮助我们追踪系统状态、定位问题、分析性能,甚至在出现问题时,日志往往是最有力的线索,基本都用它排查问题以及快速定位问题。然而,我们在敲代码时,如果随便使用 System.out.println() 来输出日志,就会导致以下一系列问题,这是完全没必要的损耗,例如:

  1. 性能差System.out.println() 直接输出到控制台,性能较差。
  2. 不易管理:日志信息没有级别区分,也没有统一的格式。
  3. 不方便追踪:没有详细的日志记录,尤其在生产环境,错误时很难追溯问题的根源。

因此,使用专业的日志框架进行日志记录显得尤为重要。今天,我们将通过一个具体的实战案例,学习如何使用 SLF4J + Logback 配合 Lombok 提供的 @Slf4j 注解,封装出一个统一的日志工具类,帮助我们高效、优雅地管理日志输出。

1. 为什么使用日志工具而非 System.out??

理由很简单,使用 System.out.println() 进行日志输出虽然简单,但它存在许多弊端,尤其是随着项目的复杂度提高,逐渐暴露出性能、管理和可维护性等问题:

  • 性能问题System.out.println() 直接输出到控制台,每次调用都会消耗一定的系统资源。在高并发、频繁调用的情况下,控制台输出会显得非常低效,严重影响系统性能。
  • 日志级别管理 :日志记录的级别(如调试信息、错误信息、警告信息等)在 System.out.println() 中完全无法区分。而使用日志框架时,我们可以清晰地定义日志级别,例如 DEBUGINFOWARNERROR 等,不同级别的日志可以分别输出到控制台或文件中,帮助我们更好地管理日志信息。
  • 格式统一性:在项目中,每个模块、每个开发人员可能都会采用不同的日志格式,导致日志混乱、难以阅读。使用日志工具类可以帮助我们统一日志输出格式,方便调试和查看。

因此,选择使用专门的日志框架来替代 System.out.println(),不仅能提高性能和可维护性,还能帮助我们更好地追踪问题。

2. 封装统一日志输出格式与级别

使用 SLF4J 和 Logback 组合

SLF4J(Simple Logging Facade for Java),它是 Java 中最常用的日志接口,它并不直接提供日志实现,而是通过 API 抽象化了日志框架。Logback 是与 SLF4J 配合使用的日志框架,它提供了强大的日志功能,能够管理日志的输出级别、格式化、存储等,谁用谁爽,不信你试试。

配置 Logback,引入相关依赖

首先,我们需要引入 SLF4JLogback 相关的依赖。在 Maven 中,我们可以像这样引入:

xml 复制代码
<dependencies>
    <!-- SLF4J API -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.32</version>
    </dependency>
    <!-- Logback 实现 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.6</version>
    </dependency>
    <!-- Logback 核心库 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.6</version>
    </dependency>
</dependencies>

接下来,我们还需要在 src/main/resources 目录下创建 logback.xml 配置文件,配置日志输出格式、输出级别等:

xml 复制代码
<configuration>

    <!-- 配置日志输出格式 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %5p [%t] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 定义日志级别 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

再如上这个配置中,我们可以设置日志输出的格式,包括输出时间、日志级别、线程名、类名、日志内容等。日志级别被设置为 DEBUG,意味着所有 DEBUG 级别及以上的日志信息都会被输出,当然这个级别在生产环境可以设置为更高一级的,比如ERROR,这样直接可对标排查报错等异常。

使用 Lombok 的 @Slf4j 注解

在传统日志框架中,开发者需要手动创建 Logger 对象,但使用 Lombok 提供的 @Slf4j 注解后,我们无需再手动声明 Logger。Lombok 会自动为我们生成 Logger 实例。

java 复制代码
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LogExample {

    public static void main(String[] args) {
        log.info("This is an info message");
        log.debug("This is a debug message");
        log.error("This is an error message");
        log.warn("This is a warning message");
    }
}

通过使用 @Slf4j 注解,我们不需要显式地创建 Logger 对象,直接使用 log 进行日志记录,简化了代码。

3. 实战:API 日志统一、异常追踪日志输出

API 日志统一

在实际项目中,尤其是 Web 项目中,我们往往需要统一记录 API 请求和响应的日志。通过日志工具,我们能够记录请求的详细信息,包括请求的 URL、参数、请求方法等,还能记录响应内容和状态。

以下是一个简单的示例,展示如何记录 API 日志:

java 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class APIController {

    @GetMapping("/api/test")
    public String testAPI() {
        // 记录 API 请求日志
        log.info("API request received for /api/test");

        // 业务处理
        String response = "Hello, world!";

        // 记录 API 响应日志
        log.info("API response: {}", response);

        return response;
    }
}

在如上这个demo中,log.info() 记录了 API 请求的日志和响应的日志。你可以轻松地根据业务需求修改日志级别,例如在调试时使用 DEBUG,在出错时使用 ERROR 等。

异常追踪日志输出

在系统出现异常时,日志记录尤为重要,它能帮助开发者快速定位问题。在生产环境中,异常日志通常包含详细的堆栈信息,这有助于我们追踪问题的根本原因。

以下是如何记录异常日志的示例:

java 复制代码
public class ExceptionHandler {

    public void handleException() {
        try {
            // 可能抛出异常的代码
            int result = 10 / 0;
        } catch (Exception e) {
            // 记录异常日志
            log.error("An error occurred: ", e);
        }
    }
}

在代码中,我们就通过 log.error() 来记录发生异常时的堆栈信息。这样,当问题发生时,我们可以迅速查看到详细的异常信息,帮助我们定位问题。

4. 流程图:日志处理流程

为了帮助大家理解日志记录的整体流程,如下是我绘制的一张流程图,展示了日志从记录到输出的完整过程,希望对大家能有所帮助:

如上这张流程图,我是展示了从接收到日志请求,到选择日志级别,再到日志输出的过程。不同的日志级别通过配置输出到不同的地方(例如控制台或文件),最后帮助我们开发者分析和解决问题。

最后

这一期,我们通过 SLF4J、Logback 和 Lombok 的 @Slf4j 注解,学习了如何封装一个统一的日志工具类。通过该工具类,我们能够更加高效、统一地记录日志,避免使用 System.out.println() 这种不专业的日志打印方式。日志级别的统一管理、格式的统一输出、异常堆栈的追踪都使得我们的开发更加高效,并且有助于快速定位问题,大家还没尝试过的必须升级试试。

统一的日志工具不仅能帮助我们记录 API 请求、响应和异常信息,还能为生产环境中的问题提供强有力的排查bug等支持。希望你能够在实际项目中,借助这些日志工具提升开发效率,确保系统在开发、测试和生产阶段都能获得清晰、准确的日志信息。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。 ⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

相关推荐
muyun2800几秒前
《TCP/IP详解 卷1》读书心得及基于RFC手撮一个TFTP Server
java·网络·网络协议·tcp/ip
陈随易13 分钟前
一段时间没写文章了,花了10天放了个屁
前端·后端·程序员
星星电灯猴16 分钟前
抓包工具分析接口跳转异常:安全校验误判 Bug 全记录
后端
调试人生的显微镜17 分钟前
后台发热、掉电严重?iOS 应用性能问题实战分析全过程
后端
扑克中的黑桃A18 分钟前
Python 如何获取 request response body
java
用户307429716715825 分钟前
Spring AI 评估-优化器模式完整指南
java·spring boot
扑克中的黑桃A25 分钟前
Spring Mvc + Easyui中根据查询结果导出文件
java
深栈解码25 分钟前
OpenIM 源码深度解析系列(十八):附录二数据库结构
后端
前端付豪32 分钟前
Google Ads 广告系统排序与实时竞价架构揭秘
前端·后端·架构
BillKu33 分钟前
【前后前】导入Excel文件闭环模型:Vue3前端上传Excel文件,【Java后端接收、解析、返回数据】,Vue3前端接收展示数据
java·前端·excel