SpringBoot 如何使用 Logback 进行日志记录

news2024/11/16 19:57:40

SpringBoot 如何使用 Logback 进行日志记录

在开发 Web 应用程序时,日志记录是非常重要的一部分。日志可以帮助我们跟踪应用程序的运行情况,并帮助我们快速地排查问题。在 SpringBoot 中,我们可以使用 Logback 进行日志记录。Logback 是一款高性能、灵活的日志框架,它可以满足各种不同的日志需求。

在这里插入图片描述

Logback 简介

Logback 是由 log4j 的作者 Ceki Gülcü 开发的,是一款开源的、高性能的日志框架。它是 log4j 的后继者,相比于 log4j,Logback 具有更快的速度、更低的内存消耗、更多的特性和更好的可扩展性。在 SpringBoot 中,Logback 是默认的日志框架,因此我们可以直接使用它进行日志记录。

Logback 的优点

  1. 高性能:Logback 使用异步方式进行日志记录,能够提高日志记录的性能。
  2. 灵活:Logback 提供了丰富的配置选项,可以满足各种不同的日志需求。
  3. 可扩展:Logback 提供了插件机制,可以轻松地扩展日志功能。
  4. 易用性:Logback 的配置非常简单,易于上手。

在 SpringBoot 中使用 Logback

在 SpringBoot 中,我们可以使用 Logback 进行日志记录,下面介绍如何在 SpringBoot 中使用 Logback 进行日志记录。

添加依赖

首先,我们需要在 pom.xml 文件中添加 Logback 的依赖:

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
</dependency>

配置 Logback

在 SpringBoot 中,Logback 的配置文件名为 logback-spring.xml,它应该位于 src/main/resources 目录下。下面是一个简单的 Logback 配置文件示例:

<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  
  <root level="info">
    <appender-ref ref="CONSOLE" />
  </root>
</configuration>

上面的配置文件定义了一个名为 CONSOLE 的控制台输出的 Appender,它定义了一个输出格式,包括时间戳、线程名、日志级别、类名和日志内容。然后将这个 Appender 附加到根 Logger 上,设置日志级别为 info

在代码中使用 Logback

在代码中使用 Logback 非常简单,我们可以使用 org.slf4j.Logger 接口来进行日志记录,例如:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class HelloController {

    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);

    @RequestMapping("/hello")
    public String hello() {
        logger.info("hello");
        return "hello";
    }

}

上面的代码中,我们使用 LoggerFactory.getLogger() 方法来获取一个 Logger 对象,然后使用 logger.info() 方法来进行日志记录。

配置日志级别

在 Logback 中,日志级别有以下几种:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR

在实际开发中,我们可以根据需要设置不同的日志级别。例如,我们可以将日志级别设置为 DEBUG,这样就可以输出更详细的日志信息。在 Logback 的配置文件中,可以通过以下方式设置日志级别:

<root level="debug">
  <appender-ref ref="CONSOLE" />
</root>

上面的配置文件将日志级别设置为 debug,这样就可以输出所有级别的日志信息。

配置日志文件

除了将日志输出到控制台外,我们还可以将日志输出到文件中。在 Logback 中,可以使用 FileAppender 将日志输出到文件中。下面是一个将日志输出到文件的 Logback 配置文件示例:

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>/var/log/myapp.log</file>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="FILE" />
  </root>
</configuration>

上面的配置文件定义了一个名为 FILE 的 Appender,它将日志输出到文件 /var/log/myapp.log 中,并且设置了一个输出格式,包括时间戳、线程名、日志级别、类名和日志内容。然后将这个 Appender 附加到根 Logger 上,设置日志级别为 info

配置日志滚动

当日志文件变得越来越大时,我们需要将其滚动到另一个文件中,以防止日志文件过大。在 Logback 中,可以使用 RollingFileAppender 将日志输出到滚动文件中。下面是一个将日志输出到滚动文件的 Logback 配置文件示例:

<configuration>
  <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/myapp.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>/var/log/myapp.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
      <maxFileSize>10MB</maxFileSize>
      <maxHistory>30</maxHistory>
      <totalSizeCap>1GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="info">
    <appender-ref ref="ROLLING_FILE" />
  </root>
</configuration>

上面的配置文件定义了一个名为 ROLLING_FILE 的滚动文件输出的 Appender,它将日志输出到文件 /var/log/myapp.log 中,并且设置了一个滚动策略,当日志文件大小达到 10MB 或者到达 yyyy-MM-dd 的新一天时,将日志滚动到新的文件中,并且保留 30 个历史日志文件,总大小不超过 1GB。然后将这个 Appender 附加到根 Logger 上,设置日志级别为 info

使用 MDC 进行日志追踪

在实际开发中,我们通常需要对请求进行跟踪,以便查找问题。在 Logback 中,使用 MDC(Mapped Diagnostic Context)可以很方便地进行日志追踪。MDC 是一个键值对的集合,可以存储与当前线程相关联的上下文信息。下面是一个使用 MDC 进行日志追踪的示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

@RestController
public class HelloController {

    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);

    @RequestMapping("/hello")
    public String hello() {
        MDC.put("requestId", UUID.randomUUID().toString());
        logger.info("hello");
        MDC.remove("requestId");
        return "hello";
    }

}

上面的代码中,我们使用 MDC.put() 方法将一个 UUID 存储到 MDC 中,然后使用 logger.info() 方法进行日志记录。在日志输出中,我们可以使用 %X{requestId} 来获取 MDC 中的值,例如:

2023-06-23 10:30:45.123 [http-nio-8080-exec-1] INFO  com.example.demo.HelloController - hello [requestId=ee7bda1b-1c1a-4a47-a7b2-8478a0cb3a1d]

上面的日志输出中,requestId 的值是从 MDC 中获取的。

使用 Logback 进行异常处理

在实际开发中,我们需要对异常进行处理,以便及时发现和修复问题。在 Logback 中,可以使用 %ex%rEx 输出异常的堆栈信息。下面是一个使用 Logback 进行异常处理的示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class HelloController {

    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);

    @RequestMapping("/hello")
    public String hello() {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            logger.error("hello error", e);
        }
        return "hello";
    }

}

上面的代码中,我们使用 try...catch 块捕获异常,并使用 logger.error() 方法进行日志记录。在日志输出中,我们可以看到异常的堆栈信息,例如:

2023-06-23 10:30:45.123 [http-nio-8080-exec-1] ERROR com.example.demo.HelloController - hello error
java.lang.ArithmeticException: / by zero
        at com.example.demo.HelloController.hello(HelloController.java:14) ~[classes/:na]
        ...

上面的日志输出中,可以看到异常的堆栈信息被输出到日志中。

总结

Logback 是一款高性能、灵活的日志框架,它可以满足各种不同的日志需求。在 SpringBoot 中,Logback 是默认的日志框架,我们可以直接使用它进行日志记录。在本文中,我们介绍了如何在 SpringBoot 中使用 Logback 进行日志记录,包括添加依赖、配置 Logback、在代码中使用 Logback、配置日志级别、配置日志文件、配置日志滚动、使用 MDC 进行日志追踪、使用 Logback 进行异常处理等方面。希望本文能够帮助大家更好地使用 Logback 进行日志记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/676786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

F407/103MAP文件

认识MAP文件 MDK编译工程&#xff0c;会生成一些中间文件&#xff08;如.o、.axf、.map 等&#xff09;&#xff0c;最终生成hex文件&#xff0c;以便下载到MCU上面执行。这些文件分为 11 个类型&#xff0c;其中4种文件比较重要。 比如&#xff1a; 本文主要讲解map文件。 map…

第四章 死锁

目录 一、死锁的概念 1.1 什么是死锁 1.2 死锁、饥饿、死循环的区别 1.2.1 死锁 1.2.2 饥饿 1.2.3 死循环 1.2.4 三者间的异同 1.3 死锁产生的必要条件 1.3.1 互斥条件 1.3.2 不剥夺条件 1.3.3 请求和保持条件 1.3.4 循环等待条件 1.4 什么时候会发生死锁 1.5 …

深入理解Java中的synchronized

文章目录 前言正文一、多线程操作同一数据时的问题二、问题分析三、synchronized 解决问题四、synchronized 是怎么解决问题的五、Java1.6时的优化5.1 自旋锁5.2 自适应锁5.3 锁消除5.4 锁粗化5.5 偏向锁&#xff08;单线程高效场景&#xff09;5.2 轻量级锁&#xff08;多线程…

MySQL数据表查询

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;进入MySQL知识专…

IO、存储、文件系统的简单介绍

目录 一.什么是IO 第一类:存储器IO 第二类:设备IO 二.存储 三:文件系统 总结 一.什么是IO I(input):放入数据 O(output):取出数据 所以我们平时说的IO,实际上就是放入数据和存储数据的意思 在这里,我们一般将IO又分为两大类 第一类:存储器IO 这类IO主要针对的是计算机中…

2023年最新同步网盘排行榜,了解哪些平台适合您的文件同步需求!

在数码领域&#xff0c;同步盘是一个极其受欢迎的工具&#xff0c;它可以帮助人们在不同设备之间共享文件。作为同步盘用户&#xff0c;我们关心的一个很重要的问题就是&#xff0c;在同步盘市场上&#xff0c;哪些同步盘是最好的&#xff1f; 今天我们综合了不同的产品测评网站…

Vulnhub: Corrosion:2靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.131 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.131 通过nmap脚本枚举出8080端口存在backup.zip文件&#xff0c;下载后解压发现需要密码&#xff0c;利用john爆破压缩包密…

【SSM项目整合流程】

目录 一.用Maven创建一个project项目 1.1新建一个项目&#xff0c;选择Maven然后点击下一步 1.2设置项目名称和AGV后点击完成 1.3在pom.xml文件中导入依赖和配置打包方式 二.添加web工程 2.1在Project Structure中型添加一个web工程 2.2配置web.xml 三.创建SpringMVC的…

2.设置Salesforce开发环境

文章目录 前言1. 关于Salesforce DX环境2. 配置Visual Studio Code2.1 安装CLI2.2 设置Visual Studio Code 3. 创建一个Hello World Lightning web component 来检证开发环境3.1 创建一个Salesforce DX project3.2 将deploy好的组件加到lightning App中 前言 此处解释关于本文…

数据结构——C语言实现常见排序(插入排序、希尔排序、选择排序、堆排序、冒泡排序)

引言&#xff1a; 现在是北京时间2023年6月23日13点19分&#xff0c;度过了一个非常愉快的端午节。由于刚从学校回家&#xff0c;一下子伙食强度直升了个两三个档次。这也导致我的肠胃不堪重负&#xff0c;我也准备等会去健身房消耗一下盈余的热量。回到家陪伴爷爷走人生最后的…

C++11 线程库—线程操作(更新中)

前言 在C11推出线程库前&#xff0c;Windows和Linux操作系统的线程操作并不同&#xff0c;这就导致多线程程序无法跨平台&#xff0c;如果想要跨平台&#xff0c;会很麻烦并且容易出错。C11推出的线程库就解决了这一问题。 因为在Windows和Linux操作系统中有一些独特的常量&am…

OpenGL 鼠标拾取模型

1.简介 在我们的场景中&#xff0c;使用鼠标光标点击或“挑选”一个3d对象是很有用的。一种方法是从鼠标投射3d光线&#xff0c;通过相机&#xff0c;进入场景&#xff0c;然后检查光线是否与任何物体相交。这通常被称为光线投射。 我们不是从局部空间中的网格开始&#xff0c…

gRPC 实践

RPC 包管理&#xff0c;1.12前&#xff1b;旧版本要设置GO111MODULEoff&#xff1b;查找gopath/src;goroot/src&#xff1b;几乎没有包管理&#xff1b; 新版本&#xff1b;go.mod&#xff1b; module xxx go version设置GO111MODULEon 是什么 远程过程调用&#xff1b; …

Windows页面置换算法与文件操作

实验一 一、实验内容或题目&#xff1a; 随机产生页面访问序列&#xff0c;并实现LRU, FIFO, OPT三种算法进行缺页比较 二、实验目的与要求&#xff1a; 1、编写程序&#xff0c;随机产生页面访问序列&#xff0c;并实现LRU, FIFO, OPT三种算法进行缺页比较。 2、理解三种算…

自监督学习简介

1.  自监督学习 自监督学习是可以看做是一种特殊的无监督学习的一个子类别&#xff08;但并非无监督学习&#xff09;&#xff0c;因为它利用了未标记的数据。 关键思想是让模型无需手动标签即可学习数据表示。一旦模型学会了如何表示数据&#xff0c;那么它就可以用较少量的…

liunx+docker+rabbitmq安装延迟队列插件

安装版本 rabbit: RabbitMQ 3.8.16 erlang: Erlang 23.3.2 rabbit: rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez 准备 1.rabbmitMQ 安装 docker pull rabbitmq 2.rabbmitMQ 启动 docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER用户…

10 种分布式系统必备模式

在当今的技术领域中&#xff0c;分布式系统已成为许多大型应用程序和平台的核心。构建高性能、可伸缩和可靠的分布式系统是一个复杂的挑战&#xff0c;需要合理的架构设计和模式选择。本文将介绍10个必备的分布式系统模式&#xff0c;帮助您更好地理解和应用这些模式以提升系统…

pytorch笔记:RNN 系列

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN RNN可以处理变长序列&#xff0c;是因为其每个时刻的参数是共享的RNN每算出一个时刻都可以输出&#xff0c;适合流式输出&#xff0c;但串行计算比较慢&#xff0c;无法获取太长的历史信息RNN 初始隐状态不提供默认是0&am…

一、枚举类型——用枚举实现状态机

枚举类型很适合用来实现状态机。状态机可以处于有限数量的特定状态。它们通常根据输入&#xff0c;从一个状态移动到下一个状态&#xff0c;但同时也会存在瞬态。当任务执行完毕后&#xff0c;状态机会立即跳出所有状态。 每个状态都有某些可接受的输入&#xff0c;不同的输入…

你应该知道的 Python 自动化脚本

概要 我们都有一些需要重复做的任务。幸运的是&#xff0c;我们可以将其中一些过程自动化&#xff0c;这样我们就可以专注于做其他真正需要精力和注意力的事情。 在这篇文章中&#xff0c;我们将谈论一些 Python 自动化脚本&#xff0c;你可以轻松地用它们来执行自动化任务。重…