日志体系结构与框架:历史、实现与如何在 Spring Cloud 中使用日志体系
文章目录
- 1. 引言
- 2. 日志体系结构
- 3. 日志框架的发展历程
- 日志框架特点对比
- 4. 日志记录器的使用与管理
- 使用 SLF4J 和 Logback 的日志记录示例
- 5. Spring Cloud 中的日志使用
- 5.1 日志框架集成
- 5.2 分布式追踪:Spring Cloud Sleuth 和 Zipkin
- 添加 Sleuth 和 Zipkin 依赖:
- 日志中分布式追踪信息的示例:
- 6. 集中式日志管理:ELK Stack
- ELK 集成步骤:
- 7. 总结
1. 引言
在现代软件开发中,日志是系统的“眼睛”,帮助开发人员洞察系统运行状态、调试问题、排查故障,并提供必要的业务数据支持。随着系统复杂度的增加,特别是在微服务架构中,日志管理变得至关重要。从日志的历史演变、底层框架到如何在 Spring Cloud 这样复杂的分布式系统中高效管理日志,本文将全面深入探讨日志体系的架构设计、日志框架的演进,以及如何在 Spring Cloud 中集成和使用日志体系。
2. 日志体系结构
日志体系通常由以下几个核心组件组成,帮助开发人员在系统中生成、格式化、输出和存储日志信息:
- 日志记录器(Logger):用于创建日志事件,并将其发送给下游组件。Logger 是应用代码与日志系统的交互点。
- 日志处理器(Handler/Appender):负责将日志事件传递到指定的输出目标,比如文件、控制台、远程服务器或集中式日志系统。
- 日志格式化器(Formatter):用于定义日志的输出格式,如时间戳、日志级别、线程 ID 等信息。
- 日志存储(Storage):负责存储日志信息,常见的存储介质包括文件系统、数据库、集中化日志管理工具如 Elasticsearch。
日志流的过程可以简化为以下架构:
[ Application Code ] -> [ Logger ] -> [ Appender ] -> [ Formatter ] -> [ Storage ]
3. 日志框架的发展历程
随着应用程序的复杂性增长,日志框架经历了从简单的输出到复杂的日志管理系统的演变。以下是 Java 领域主要日志框架的历史发展:
| 日志框架 | 出现时间 | 主要特点 | 适用场景 |
|---|---|---|---|
java.util.logging (JUL) | JDK 1.4 时代 | JDK 自带,简单易用,但灵活性较差。 | 小型应用或日志需求较低的场景。 |
Apache Log4j | 1999 | 功能强大,支持多种输出目标与格式化器。 | 复杂系统、需要定制日志输出场景。 |
Logback | 2006 | Log4j 的改进版,性能更高,功能更全面。 | 高并发、高性能的系统。 |
SLF4J | 2005 | 日志门面框架,统一日志 API,支持多个底层日志实现。 | 大型项目需要切换日志框架时使用。 |
Log4j2 | 2014 | Log4j 的改进版本,异步日志支持性能更优。 | 需要异步高性能日志处理的应用。 |
日志框架特点对比
| 特性 | java.util.logging | Log4j | Logback | SLF4J | Log4j2 |
|---|---|---|---|---|---|
| 配置灵活性 | 低 | 高 | 高 | 中立 | 很高 |
| 性能 | 中等 | 良好 | 优秀 | 中立 | 优秀 |
| 异步支持 | 无 | 需插件 | 原生支持 | 中立 | 原生支持 |
| 门面框架支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
4. 日志记录器的使用与管理
日志框架通常提供多个日志级别,帮助开发者过滤不同重要程度的日志事件:
FATAL:表示系统崩溃的严重错误。ERROR:错误日志,不会导致系统崩溃,但需要关注。WARN:警告信息,提示可能出现的问题。INFO:普通运行信息,表示系统正常状态。DEBUG:用于调试的信息。TRACE:更详细的调试信息。
使用 SLF4J 和 Logback 的日志记录示例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass {private static final Logger logger = LoggerFactory.getLogger(MyClass.class);public void doSomething() {logger.info("This is an info message");logger.debug("This is a debug message");try {// Simulate exceptionthrow new RuntimeException("Exception occurred");} catch (Exception e) {logger.error("An error occurred", e);}}
}
5. Spring Cloud 中的日志使用
Spring Cloud 作为一个用于构建分布式系统的框架集合,在微服务架构中对日志的需求尤为重要。微服务环境下,日志体系不仅仅是单个服务的输出,还涉及到跨服务的分布式日志收集与追踪、集中管理等功能。
5.1 日志框架集成
在 Spring Cloud 项目中,SLF4J 和 Logback 是最常用的日志框架组合。SLF4J 作为日志门面提供统一的接口,而 Logback 则负责具体的日志实现。以下是 Spring Cloud 项目中使用 Logback 的基本配置:
<configuration><property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${LOG_PATTERN}</pattern></encoder></appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/spring-cloud-app.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>logs/spring-cloud-app.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>${LOG_PATTERN}</pattern></encoder></appender><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="FILE"/></root><logger name="org.springframework" level="WARN"/><logger name="com.example" level="DEBUG"/>
</configuration>
该配置文件定义了将日志输出到控制台和文件中,并对日志级别进行配置。
5.2 分布式追踪:Spring Cloud Sleuth 和 Zipkin
在微服务架构中,跨多个服务的调用链日志管理尤为重要。Spring Cloud Sleuth 是一个分布式追踪库,它为每个请求生成唯一的 traceId 和 spanId,从而可以在多个服务之间追踪请求的流向。通过与 Zipkin 集成,开发者可以可视化这些追踪信息。
添加 Sleuth 和 Zipkin 依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
在 application.yml 文件中配置 Zipkin 追踪:
spring:sleuth:sampler:probability: 1.0zipkin:base-url: http://localhost:9411enabled: true
通过 Docker 启动 Zipkin:
docker run -d -p 9411:9411 openzipkin/zipkin
日志中分布式追踪信息的示例:
2024-09-23 10:12:45 [http-nio-8080-exec-1] INFO [traceId=1a2b3c4d, spanId=5f6g7h8i] com.example.MyService - Processing order
traceId 和 spanId 用于追踪分布式系统中的跨服务调用链。
6. 集中式日志管理:ELK Stack
在 Spring Cloud 的微服务架构中,集中化日志管理是解决多服务日志分散问题的有效方法。ELK Stack(Elasticsearch、Logstash、Kibana)提供了日志收集、存储、查询和可视化的完整解决方案。
- Elasticsearch:用于存储和查询日志数据。
- Logstash:用于从不同服务中收集和处理日志数据。
- Kibana:用于可视化日志并帮助分析。
ELK 集成步骤:
- 安装 ELK Stack(通过 Docker Compose 安装)。
- 配置 Logstash 收集日志:
input {file {path =>"/path/to/your/logfile.log"start_position => "beginning"} }output {elasticsearch {hosts => ["http://localhost:9200"]index => "spring-cloud-logs-%{+YYYY.MM.dd}"} } - 配置 Spring Cloud 日志输出到 Logstash。
- 使用 Kibana 进行日志可视化与分析。
7. 总结
日志作为软件系统中不可或缺的部分,从早期的简单文本输出演进为复杂的、支持高并发、高性能和分布式追踪的完整体系。在 Spring Cloud 微服务架构中,合理的日志体系设计可以极大提升系统的可观测性和可维护性。通过集成 SLF4J、Logback、Sleuth、Zipkin 和 ELK Stack 等工具,我们可以构建一个功能完备、性能优越的日志系统,帮助开发者在高复杂度环境中快速排查问题并提升系统稳定性。
相关文章:
日志体系结构与框架:历史、实现与如何在 Spring Cloud 中使用日志体系
文章目录 1. 引言2. 日志体系结构3. 日志框架的发展历程日志框架特点对比 4. 日志记录器的使用与管理使用 SLF4J 和 Logback 的日志记录示例 5. Spring Cloud 中的日志使用5.1 日志框架集成5.2 分布式追踪:Spring Cloud Sleuth 和 Zipkin添加 Sleuth 和 Zipkin 依赖…...
图文深入理解SQL语句的执行过程
List item 本文将深入介绍SQL语句的执行过程。 一.在RDBMS(关系型DB)中,看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂,也就是说,你执行了一条诸如select count(*) where id 001 from table_name的非常简…...
ubuntu安装StarQuant
安装boost 下面展示一些 内联代码片。 sudo apt install libboost-all-dev -y安装libmongoc-1.0 链接: link // An highlighted block sudo apt install libmongoc-1.0-0 sudo apt install libbson-1.0 sudo apt install cmake libssl-dev libsasl2-dev编译源码 $ git clone…...
学习篇 | Jupyter 使用(notebook hub)
1. JupyterHub 1.1 快速尝试 jupyterhub -f/path/jupyter_config.py --no-ssl1.2 长期后台运行 bash -c "nohup jupyterhub -f/path/jupyter_config.py --no-ssl" > ~/jupyterhub.log 2>&1 &1.3 帮助 jupyterhub --help2. Jupyter Notebook 2.1 快…...
【裸机装机系列】8.kali(ubuntu)-虚拟内存swap交换分区扩展
推荐阅读: 1.kali(ubuntu)-为什么弃用ubuntu,而选择基于debian的kali操作系统 linux swap交换分区,相当于win系统虚拟内存的概念。当linux系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前…...
异步请求的方法以及原理
异步请求是指在发送请求后,不会阻塞程序的执行,而是继续执行后续的代码,等待请求返回后再执行相应的回调函数。常见的异步请求方法包括使用XMLHttpRequest对象(XHR)和fetch API。 异步请求的方法 1. XMLHttpRequest (X…...
SpringCloud入门(六)Nacos注册中心(下)
一、Nacos环境隔离 Nacos提供了namespace来实现环境隔离功能。 nacos中可以有多个namespace。namespace下可以有group、service等。不同namespace之间相互隔离,例如不同namespace的服务互相不可见。 使用Nacos Namespace 环境隔离 步骤: 1.在Nacos控制…...
【RDMA】mlxlink检查和调试连接状态及相关问题--驱动工具
简介 mlxlink工具用于检查和调试连接状态及相关问题。该工具可以用于不同的链路和电缆(包括被动、电动、收发器和背板)。 属于mft工具套件的一个工具,固件工具 Firmware Tools (MFT):https://blog.csdn.net/bandaoyu/article/details/14242…...
QT For Android开发-打开PPT文件
一、前言 需求: Qt开发Android程序过程中,点击按钮就打开一个PPT文件。 Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件,非常方便。QDesktopServices提供了静态接口调用系统级别的功能。 这里用的QDesk…...
SpringBoot教程(三十) | SpringBoot集成Shiro权限框架
SpringBoot教程(三十) | SpringBoot集成Shiro权限框架 一、 什么是Shiro二、Shiro 组件核心组件其他组件 三、流程说明shiro的运行流程 四、SpringBoot 集成 Shiro (shiro-spring-boot-web-starter方式)1. 添加 Shiro 相关 maven2…...
[ffmpeg] 视频格式转换
本文主要梳理 ffmpeg 中的视频格式转换。由于上屏的数据是 rgba,编码使用的是 yuv数据,所以经常会使用到视频格式的转换。 除了使用 ffmpeg进行转换,还可以通过 libyuv 和 directX 写 shader 进行转换。 之前看到文章说 libyuv 之前是 ffmpeg…...
git-repo系列教程(3) git-repo https证书认证问题
文章目录 问题描述解决步骤1.下载证书2.测试证书是否正常3.设置环境变量 总结 问题描述 在使用git repo 同步仓库时,发现不能同步,出现如下提示错误: % Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left …...
中序遍历二叉树全过程图解
文章目录 中序遍历图解总结拓展:回归与回溯 中序遍历图解 首先看下中序遍历的代码,其接受一个根结点root作为参数,判断根节点是否为nil,不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …...
设计模式 组合模式(Composite Pattern)
组合模式简绍 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样,可以在不知道对象具体类型的条…...
在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路
什么是vitepress vitepress是一种将markdown文件渲染成静态网页的技术 其使用仅需几行命令即可 //在根目录安装vitepress npm add -D vitepress //初始化vitepress,添加相关配置文件,选择主题,描述,框架等 npx vitepress init //…...
神经网络面试题目
1. 批规范化(Batch Normalization)的好处都有啥?、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是:A 解析: batch normalization 就…...
C语言题目之单身狗2
文章目录 一、题目二、思路三、代码实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况,而本道题是出现两个单身狗的情况。根据一个数…...
Vue2学习笔记(03关于VueComponent)
1.school组件本质是一个名为Vuecomponent的构造函数,且不是程序员定义的,是Vue.extend生成的。 2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new Vuecompo…...
微服务架构中常用技术框架
认证授权 Spring Security OAuth 2.0 JWT Keycloak Istio Apache Shiro 日志监控 ELK Prometheus Grafana Fluentd CI/CD Jenkins GitLab CI CircleCI ArgoCD 服务通信 gRPC REST API Apache Thrift Apache Avro Apache Dubbo OpenFegin 断路器 Hystr…...
[深度学习]Pytorch框架
1 深度学习简介 应用领域:语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年,chatGPT出现,进入AIGC发展阶段3 PyTorch框架简…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
