日志体系结构与框架:历史、实现与如何在 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框架简…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...