【Springboot系列】SpringBoot 中的日志如何工作的,看完这一篇就够了

文章目录

      • 强烈推荐
      • 引言
      • Spring Boot 中的日志是怎么工作
        • 日志框架选择
        • 配置文件
        • 日志级别
        • 自定义日志配置
        • 集成第三方日志库
        • 实时监控和日志管理
      • Log4j2工作原理分析
        • 1. 核心组件
        • 2. 配置文件
        • 3. Logger的继承和层次结构
        • 4. 日志事件处理流程
        • 5. 异步日志
      • 总结
      • 强烈推荐
      • 专栏集锦
      • 写在最后

579a429daf314744b995f37351b46548

强烈推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能

b004071ozy_05_amzn

推荐一个个人工作,日常中比较常用的人工智能工具,无需魔法,忍不住分享一下给大家。点击跳转到网站:人工智能工具

image-20240329011034493


引言

在软件开发中,日志记录是一个至关重要的部分,它不仅帮助开发者调试和诊断问题,还在系统监控和安全审计中发挥重要作用。

Spring Boot 作为一个流行的Java框架,提供了强大的日志记录机制,使开发者可以轻松地集成和配置日志功能。

本文将深入探讨Spring Boot中的日志工作原理,帮助您更好地理解和利用这一功能。


Spring Boot 中的日志是怎么工作

日志框架选择

Spring Boot 默认支持多种日志框架,包括Logback、Log4j2和Java Util Logging (JUL)。在没有特定配置的情况下,Spring Boot 会自动选择Logback作为日志框架。这种默认配置使得开发者可以开箱即用地享受日志功能,而无需额外配置。

配置文件

Spring Boot 使用外部配置文件(例如application.properties或application.yml)来配置日志。常见的配置包括日志级别、输出格式和日志文件位置。例如:

logging.level.root=INFO
logging.level.com.example.myapp=DEBUG
logging.file.name=app.log
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n

这些配置可以细粒度地控制不同包和类的日志级别,使开发者能够针对不同的需求进行调整。

日志级别

Spring Boot 支持的日志级别有TRACE、DEBUG、INFO、WARN、ERROR、FATAL和OFF。每个级别控制不同的详细程度,开发者可以根据具体需求选择适当的级别。日志级别的配置既可以在全局范围内设置,也可以针对特定的包或类进行设置。

自定义日志配置

除了简单的配置文件,Spring Boot 还允许使用更为复杂的日志配置。例如,开发者可以通过Logback的XML配置文件来定义更加复杂的日志规则和行为:

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

这种配置方式提供了比简单配置文件更高的灵活性和可定制性。

集成第三方日志库

Spring Boot 还支持与第三方日志库的集成,例如SLF4J和Commons Logging。通过这些库,开发者可以使用统一的API记录日志,而实际的日志实现由底层框架决定。这种抽象层使得日志记录更加灵活和便于维护。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyApp {private static final Logger logger = LoggerFactory.getLogger(MyApp.class);public static void main(String[] args) {logger.info("Application started");// Other code}
}
实时监控和日志管理

Spring Boot 还支持将日志数据发送到外部的日志管理和监控系统,例如ELK(Elasticsearch, Logstash, Kibana)或Splunk。这些集成能够帮助开发者实时监控应用的运行状态,并进行复杂的日志分析和报表生成。


Log4j2工作原理分析

Log4j2是Apache Log4j项目的第二代版本,是Java应用中广泛使用的日志框架之一。

它提供了强大的功能和灵活的配置,能够满足各种日志记录需求。

1. 核心组件

Log4j2的工作原理可以通过其核心组件来理解,这些组件包括Logger、Appender、Layout和Filter。

  • Logger:日志记录器,是Log4j2的核心接口。Logger负责捕获日志事件并将其传递给配置的Appender。每个Logger都有一个名称,并且可以继承父Logger的配置。
  • Appender:日志输出器,负责将日志事件输出到特定的目标位置,如控制台、文件、数据库等。常见的Appender包括ConsoleAppender、FileAppender和RollingFileAppender。
  • Layout:布局,负责将日志事件格式化为特定的输出格式。常见的布局包括PatternLayout、JSONLayout和HTMLLayout。
  • Filter:过滤器,用于对日志事件进行过滤,以决定是否将其输出。Filter可以应用在Logger和Appender上,提供灵活的日志控制。
2. 配置文件

Log4j2支持多种配置文件格式,包括XML、JSON、YAML和properties。下面是一个简单的YAML配置示例:

Configuration:status: warnappenders:console:name: Consoletarget: SYSTEM_OUTPatternLayout:pattern: "%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"loggers:root:level: infoAppenderRef:- ref: Consolelogger:- name: com.example.myapplevel: debugadditivity: falseAppenderRef:- ref: Console
3. Logger的继承和层次结构

Log4j2的Logger具有层次结构,子Logger可以继承父Logger的配置。例如,com.examplecom.example.myapp的父Logger。如果com.example.myapp没有明确配置,则会继承com.example的配置。这种层次结构使得日志配置更加灵活和简洁。

4. 日志事件处理流程

当应用程序调用Logger记录日志时,Log4j2会按照以下流程处理日志事件:

  1. 日志记录:应用程序调用Logger的记录方法(如logger.info())。
  2. 日志过滤:Logger和Appender中的Filter对日志事件进行过滤,决定是否处理该日志事件。
  3. 日志格式化:如果日志事件通过过滤,Appender会使用配置的Layout对日志事件进行格式化。
  4. 日志输出:格式化后的日志事件由Appender输出到指定目标位置(如控制台或文件)。
5. 异步日志

Log4j2支持异步日志,可以显著提高日志记录的性能。异步日志将日志事件放入队列中,独立的线程从队列中取出日志事件并进行处理。这种方式减少了应用主线程的阻塞时间,适用于高并发环境。

下面是一个使用异步日志的YAML配置示例:

Configuration:status: warnappenders:console:name: Consoletarget: SYSTEM_OUTPatternLayout:pattern: "%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"async:name: AsyncAppenderRef:- ref: Consoleloggers:root:level: infoAppenderRef:- ref: Async

总结

通过本文的介绍,相信您已经对Spring Boot中的日志工作原理有了全面的了解。

日志记录不仅是开发过程中不可或缺的一部分,更是维护和优化应用的重要工具。

充分利用Spring Boot提供的日志功能,您可以更高效地进行调试、监控和维护工作,确保应用的稳定和高效运行。

强烈推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能

b004071ozy_05_amzn

推荐一个个人工作,日常中比较常用的人工智能工具,无需魔法,忍不住分享一下给大家。点击跳转到网站:人工智能工具

image-20240329011034493


专栏集锦

大佬们可以收藏以备不时之需:

Spring Boot 专栏:http://t.csdnimg.cn/peKde

ChatGPT 专栏:http://t.csdnimg.cn/cU0na

Java 专栏:http://t.csdnimg.cn/YUz5e

Go 专栏:http://t.csdnimg.cn/Jfryo

Netty 专栏:http://t.csdnimg.cn/0Mp1H

Redis 专栏:http://t.csdnimg.cn/JuTue

Mysql 专栏:http://t.csdnimg.cn/p1zU9

架构之路 专栏:http://t.csdnimg.cn/bXAPS


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

如果有项目或者毕设合作,请V:fengyelin8866,备注毕设

csdn-end

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

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

相关文章

每日练习之矩阵乘法——斐波那契公约数

斐波那契公约数 题目描述 运行代码 #include <iostream> #include <vector> using namespace std; const long long mod 1000000007;// 矩阵乘法函数 vector<vector<long long>> matrixMultiply(const vector<vector<long long>>& …

移动端特效

一&#xff0c;触屏事件 1.触屏touch事件 2.触摸事件对象 如果侦听的是一个DOM元素&#xff0c;他俩是一样的 如果手指离开了&#xff0c;不能侦听到前两者&#xff0c;能侦听到第三个 我们一般都是触摸元素&#xff0c;所以一般都是第二个比较常用 第一个&#xff1a;屏幕…

Leetcode 力扣92. 反转链表 II (抖音号:708231408)

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

简单的基于信号处理的心电信号ECG特征波分割方法(MATLAB)

正常的心电图中&#xff0c;每个心跳周期内包含三个主要的特征波&#xff1a;&#xff30;波、QRS波和&#xff34;波&#xff0c;如下图所示。心电特征波能够反映心脏的生理状态信息&#xff0c;通过对其形状、幅值和持续时间的分析&#xff0c;可以用来辅助诊断心血管疾病。对…

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长&#xff0c;再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析&#xff0c;注释。 &#xff08;1 探讨一&#xff09;当独占指针指向数组时&#xff0c;其默认的删除器是…

mysql表约束基础 【default | 主键 | 外键 | 唯一键】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;表的约…

vue3快速入门(局部使用)

目录 前置知识JavaScript-导入导出 入门操作 变量渲染页面 局部使用vue的实现步骤 vue指令 v-for v-bind v-if v-show v-on v-model 生命周期 前置知识JavaScript-导入导出 正常情况在html导入js文件是全部导入&#xff0c;这样会导致性能上的损失 。 JS提供的…

STM32F1之OV7725摄像头·SCCB总线代码编写附带源码详解

STM32F1之OV7725摄像头-CSDN博客 STM32F1之OV7725摄像头像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解-CSDN博客 目录 1. 硬件设计 1.1 SCCB 控制相关 1.2 VGA 时序相关 1.3 FIFO 相关 1.4 XCLK 信号 2. 代码设计 2.1 SCCB总线软件实现 2.1.1 宏定…

AI图书推荐:ChatGPT解码—人工智能增强生活指南

《ChatGPT解码—人工智能增强生活指南》&#xff08;ChatGPT Decoded. A Beginners Guide to AI-Enhanced Living &#xff09;是一本由 大卫维恩斯&#xff08;David Wiens &#xff09;所著的书籍&#xff0c;旨在帮助读者了解并有效利用GPT-4语言模型这一强大工具来提升日常…

springmvc Web上下文初始化

Web上下文初始化 web上下文与SerlvetContext的生命周期应该是相同的&#xff0c;springmvc中的web上下文初始化是由ContextLoaderListener来启动的 web上下文初始化流程 在web.xml中配置ContextLoaderListener <listener> <listener-class>org.springframework.…

ncnn 优化量化

问题&#xff1a;发现推理时间过长&#xff0c;需要优化 当前正在做人脸检测部署&#xff0c;发现检测速度有点吓人&#xff0c;以下监测的时间 gpu&#xff1a; cpu&#xff1a; gpu推理大概整体时间200多毫秒&#xff0c;cpu推理时间300多毫秒&#xff0c;这里暂时没去考虑…

Oracle实践|内置函数之字符串函数

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

C++模板——函数模板和类模板

目录 泛型编程 函数模板 函数模板概念 函数模板的定义和语法 函数模板的工作原理 函数模板的实例化 隐式实例化 显示实例化 函数模板的匹配原则 类模板 类模板的定义格式 类模板的实例化 泛型编程 什么是泛型编程&#xff1f; 泛型编程&#xff08;Generic Pr…

【Linux-并发与竞争】

Linux-并发与竞争 ■ 原子操作■ 原子操作简介■ 原子整形操作 API 函数■ 原子位操作 API 函数■ 示例一&#xff1a;原子操作实验&#xff0c;使用原子变量来实现对实现设备的互斥访问 ■ 自旋锁■ 自旋锁 API 函数■ 死锁■ 最好的解决死锁方法就是获取锁之前关闭本地中断&a…

LeetCode 124 —— 二叉树中的最大路径和

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 二叉树的问题首先我们要想想是否能用递归来解决&#xff0c;本题也不例外&#xff0c;而递归的关键是找到子问题。 我们首先来看看一棵最简单的树&#xff0c;也就是示例 1。这样的一棵树总共有六条路径&#xf…

docker如何拉取nginx最新镜像并运行

要拉取Docker Hub上的最新Nginx镜像&#xff0c;您可以使用以下命令&#xff1a; docker pull nginx 这个命令会从Docker Hub下载最新版本的Nginx镜像。如果您想要拉取特定版本的Nginx镜像&#xff0c;可以指定版本号&#xff0c;例如&#xff1a; docker pull nginx:1.18.0 拉…

详细分析tcping的基本知识以及用法

目录 前言1. 安装配置2. 基本知识3. Demo 前言 针对ping的基本知识推荐阅读&#xff1a;详细分析ping的基本知识以及常见网络故障的诊断&#xff08;图文解析&#xff09; 1. 安装配置 针对Window的下载如下&#xff1a; 安装路径&#xff1a;tcping官网 下载tcping.exe&a…

《微服务王国的守护者:Spring Cloud Dubbo的奇幻冒险》

5. 经典问题与解决方案 5.3 服务追踪与链路监控 在微服务架构的广袤宇宙中&#xff0c;服务间的调用关系错综复杂&#xff0c;如同一张庞大的星系网络。当一个请求穿越这个星系&#xff0c;经过多个服务节点时&#xff0c;如何追踪它的路径&#xff0c;如何监控整个链路的健康…

VUE3 学习笔记(3):VUE模板理念、属性绑定、条件渲染、列表渲染

准备 1.清空不必要的项目文件 项目/src/assets/ 目录文件清空 项目/src/components/ 目录文件清空 删除main.js 的css引用 App.vue 代码如下 <template> </template> <script>//注意这里默认有一个setup 去掉 </script> 运行一下无错误提示就可以了…

Cohere继Command-R+之后发布大模型Aya-23,性能超越 Gemma、Mistral 等,支持中文

前言 近年来&#xff0c;多语言大模型&#xff08;MLLM&#xff09;发展迅速&#xff0c;但大多数模型的性能依然存在显著差距&#xff0c;尤其是在非英语语言方面表现不佳。为了推动多语言自然语言处理技术的发展&#xff0c;Cohere团队发布了新的多语言指令微调模型家族——…