日志体系结构与框架:历史、实现与如何在 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框架简…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
