SpringBoot如何使用日志Logback,及日志等级详解
Spring Boot默认已经集成了SLF4J(Simple Logging Facade for Java)作为日志的接口,以及Logback作为日志的实现。这意味着在大多数情况下,你无需做额外的配置即可开始记录日志。
下面是一个简要的指南,包括如何在Spring Boot应用中使用SLF4J和Logback,以及一些实际的代码示例。
默认集成
- 依赖管理:Spring Boot项目启动器(starter)已经包含了对SLF4J和Logback的依赖。当你创建一个新的Spring Boot项目时,这些依赖通常会自动加入。如果你需要手动添加,可以在
pom.xml
中确认或添加以下依赖:
<dependencies><!-- Spring Boot Starter Web 自动包含了日志相关的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
配置Logback
Spring Boot默认使用logback-spring.xml
或logback.xml
进行配置。如果没有自定义配置,它会使用内建的默认配置。
- 自定义配置:在
src/main/resources
目录下创建logback-spring.xml
文件来覆盖默认配置。例如,配置一个基础的日志级别和日志文件输出:
<?xml version="1.0" encoding="UTF-8"?>
<configuration><include resource="org/springframework/boot/logging/logback/base.xml"/><!-- 设置全局日志级别 --><root level="INFO"><appender-ref ref="FILE"/><appender-ref ref="STDOUT"/></root><!-- 定义文件日志 --><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>logs/app.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 控制台日志 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender>
</configuration>
实际代码使用
在你的Java类中,通过SLF4J的API记录日志。Spring Boot会自动为你注入一个Logger实例。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {private static final Logger log = LoggerFactory.getLogger(LogController.class);@GetMapping("/hello")public String hello() {log.debug("Debug message: This is a debug log.");log.info("Info message: This is an info log.");log.warn("Warn message: This is a warn log.");log.error("Error message: This is an error log.");return "Hello, World!";}
}
在上面的代码示例中,我们创建了一个简单的REST控制器,并在其中使用了不同级别的日志记录方法。
LoggerFactory.getLogger(LogController.class)
会返回一个Logger实例,这个实例对应于所在类的类名,这是记录日志的最佳实践。
然后,你可以调用debug()
, info()
, warn()
, 和 error()
方法来记录不同级别的日志信息。
日志输出等级是日志记录系统中用于区分日志重要性和详细程度的一种机制。不同级别的日志可以帮助开发者和运维人员更好地监控和诊断系统。
下面是常见的日志输出等级及其含义,按照从最低级别到最高级别的顺序排列:
-
TRACE: 这是最详细的日志级别,用于输出程序运行的详细跟踪信息,比如变量的详细变化、内部流程的每一步等。在调试复杂问题时非常有用,但在生产环境中通常关闭以减少日志量。
-
DEBUG: 提供调试信息,用于开发过程中跟踪程序的内部运行状态,比如进入和退出函数的信息、中间变量的状态等。这些信息对于日常开发和故障排查很有帮助,但同样,生产环境中可能只会保留关键模块的DEBUG日志。
-
INFO: 记录一般性的信息,表明系统正在按预期工作。这类日志包括应用程序启动、关闭、重要操作完成等事件。INFO日志在生产环境中通常是开启的,用于追踪系统的运行流程和状态。
-
WARN: 警告信息,指出系统中可能存在潜在的问题或不建议的操作,但不影响当前操作的继续执行。这类日志应当引起注意,可能需要检查或调整配置以防止未来发生更严重的问题。
-
ERROR: 错误信息,表示发生了应当被立即关注并修复的问题,如无法完成预期功能,但系统仍然可以运行。错误日志应详细记录错误发生的情景,以便于定位问题。
-
FATAL: 致命错误,表示非常严重的错误,可能导致应用程序崩溃或无法继续运行。这类日志极其重要,需要立即采取行动。有时,系统会在记录FATAL日志后自动终止进程。
日志级别设定的原则是,如果设置了某个级别的日志输出,那么所有比此级别严重(数值更大)的日志都会被记录下来。
例如,如果设置日志级别为INFO,那么INFO、WARN、ERROR和FATAL级别的日志都会被打印,而DEBUG和TRACE级别的日志则会被忽略。
在实际应用中,选择合适的日志级别对于确保系统性能、减少磁盘空间占用以及有效定位问题至关重要。
在开发阶段可能会使用较低的日志级别(如DEBUG),而在生产环境中则倾向于使用较高的日志级别(如INFO或WARN),以平衡日志的详细度和资源消耗。
相关文章:
SpringBoot如何使用日志Logback,及日志等级详解
Spring Boot默认已经集成了SLF4J(Simple Logging Facade for Java)作为日志的接口,以及Logback作为日志的实现。这意味着在大多数情况下,你无需做额外的配置即可开始记录日志。 下面是一个简要的指南,包括如何在Spring…...

若依启动run-modules-system.bat报错问题解决方案
在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…...

Aws CodeCommit代码仓储库
1 创建IAM用户 IAM创建admin用户,增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…...
PostgreSQL的内存参数
PostgreSQL的内存参数 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777PostgreSQL 提供了多种内存参数&#x…...
【教程】在CentOS上使用Docker部署前后端分离项目的完整指南
当在CentOS上使用Docker部署前后端分离项目时,需要遵循一系列步骤来实现这一目标。以下是每个步骤的详细内容: 步骤1:安装Docker和Docker Compose 1.1 安装Docker 在CentOS上安装Docker,可以按照以下步骤进行: sudo yum install -y yum-utils device-mapper-persistent…...

某公司新招了个牛逼的架构师后.....
网友评论: 架构师一个响指之后。第二天,老板不见了走走停停 回头已是数月图片是我的故事没错了,本来我们组有10个人,我把代码重构之后,只要半个人维护,于是老板要裁掉9个>人,于是我被搞走了图…...
云计算和雾计算
雾计算作为传统集中式数据存储系统(云)和边缘设备之间的中间层。雾扩展了云,使计算和数据存储更接近边缘。雾由多个节点(雾节点)组成,并创建一个本地网络,使其成为一个去中心化的生态系统——雾…...
正缘画像 api数据接口
测测正缘画像,相貌特征,高矮胖瘦,黑白美丑,对方何许人也,远嫁近娶,何方定居,家庭观,持家爱家,生活质量,富裕贫穷,健康情况,测算结果仅…...
Java 基础面试300题 (171- 200)
Java 基础面试300题 (171- 200) 171.什么是同步? 当多个线程试图同时访问共享资源时,那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…...

0基础学习Elasticsearch-使用Java操作ES
文章目录 1 背景2 前言3 Java如何操作ES3.1 引入依赖3.2 依赖介绍3.3 隐藏依赖3.4 初始化客户端(获取ES连接)3.5 发送请求给ES 1 背景 上篇学习了0基础学习Elasticsearch-Quick start,随后本篇研究如何使用Java操作ES 2 前言 建议通篇阅读再回…...
【Linux】GNU编译器基础
文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等,适用于C/C中,在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作,但在Linux系统中通常使用GNU编译器来进行,对于C/C等高级语言需要进行预编译、编…...
Linux 软件安装:从源码编译到包管理器安装
Linux 软件安装:从源码编译到包管理器安装 在 Linux 操作系统中,软件安装是一个非常重要的任务。不同的软件安装方式有不同的优缺点,本篇博客将介绍 Linux 软件安装的几种方式,包括从源码编译安装、使用包管理器安装和使用第三方…...

Python3 match-case 语句
前言 本文主要介绍match-case语句与switch-case的区别,及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…...
图论第三天
似乎要团建了,我再猫会。我必须参与上团建再走。 130.被围绕的区域 先把外围的O变成A,再把飞地的O变成X,再把外围A变回O class Solution { public:int neighbor[4][2] {1,0,0,-1,-1,0,0,1};void solve(vector<vector<char>>&a…...

计算机网络学习2
文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…...

unittest框架
目录 框架: unittest框架: 使用的原因: 核心要素(组成): TestCase测试用例: 可能出现的错误: TestSuite(测试套件): TestRunner(测试执行): 整体步骤: 查看执行结果: TestLoader测试加载: 方法级别Fixture: 类级别Fixture: 模块级别Fixture: 用例脚本…...
Python中的__str__和__repr__:揭示字符串表示的奥秘
标题:Python中的__str__和__repr__:揭示字符串表示的奥秘 摘要 在Python中,对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法,用于定义对象的字符串表示形式。尽管它们在功能上相似,…...

gazebo插入一个图片
在下面的目录下添加文件夹 my_ground_plane 文件夹内容如下 model.sdf <?xml version"1.0" encoding"UTF-8"?> <sdf version"1.4"><model name"my_ground_plane"><static>true</static><link na…...
(已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
Modals是Bootstrap中用户弹框用的组件,使用时不需要额外引入其他插件,在引入了boostrap.js或者boostrap.min.js前提下就可以使用。 官方的示例: <!-- Button trigger modal --> <button type="button" class="btn btn-primary" data-bs-…...
网络编程介绍(IP)(一)
定义:可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 java.net.*包下提供了网络编程的解决方案。 基本的通信架构: CS架构( Client客户端/Server服务端 ): Clie…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...