日志体系结构与框架:历史、实现与如何在 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框架简…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...
宠物车载安全座椅市场报告:解读行业趋势与投资前景
一、什么是宠物车载安全座椅? 宠物车载安全座椅是一种专为宠物设计的车内固定装置,旨在保障宠物在乘车过程中的安全性与舒适性。它通常由高强度材料制成,具备良好的缓冲性能,并可通过安全带或ISOFIX接口固定于车内。 近年来&…...
