当前位置: 首页 > news >正文

日志体系结构与框架:历史、实现与如何在 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 Log4j1999功能强大,支持多种输出目标与格式化器。复杂系统、需要定制日志输出场景。
Logback2006Log4j 的改进版,性能更高,功能更全面。高并发、高性能的系统。
SLF4J2005日志门面框架,统一日志 API,支持多个底层日志实现。大型项目需要切换日志框架时使用。
Log4j22014Log4j 的改进版本,异步日志支持性能更优。需要异步高性能日志处理的应用。

日志框架特点对比

特性java.util.loggingLog4jLogbackSLF4JLog4j2
配置灵活性中立很高
性能中等良好优秀中立优秀
异步支持需插件原生支持中立原生支持
门面框架支持支持支持支持支持支持

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 是一个分布式追踪库,它为每个请求生成唯一的 traceIdspanId,从而可以在多个服务之间追踪请求的流向。通过与 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

traceIdspanId 用于追踪分布式系统中的跨服务调用链。


6. 集中式日志管理:ELK Stack

在 Spring Cloud 的微服务架构中,集中化日志管理是解决多服务日志分散问题的有效方法。ELK Stack(Elasticsearch、Logstash、Kibana)提供了日志收集、存储、查询和可视化的完整解决方案。

  • Elasticsearch:用于存储和查询日志数据。
  • Logstash:用于从不同服务中收集和处理日志数据。
  • Kibana:用于可视化日志并帮助分析。

ELK 集成步骤:

  1. 安装 ELK Stack(通过 Docker Compose 安装)。
  2. 配置 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}"}
    }
    
  3. 配置 Spring Cloud 日志输出到 Logstash。
  4. 使用 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 分布式追踪&#xff1a;Spring Cloud Sleuth 和 Zipkin添加 Sleuth 和 Zipkin 依赖…...

图文深入理解SQL语句的执行过程

List item 本文将深入介绍SQL语句的执行过程。 一.在RDBMS&#xff08;关系型DB&#xff09;中&#xff0c;看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂&#xff0c;也就是说&#xff0c;你执行了一条诸如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交换分区扩展

推荐阅读&#xff1a; 1.kali(ubuntu)-为什么弃用ubuntu&#xff0c;而选择基于debian的kali操作系统 linux swap交换分区&#xff0c;相当于win系统虚拟内存的概念。当linux系统的物理内存不够用的时候&#xff0c;就需要将物理内存中的一部分空间释放出来&#xff0c;以供当前…...

异步请求的方法以及原理

异步请求是指在发送请求后&#xff0c;不会阻塞程序的执行&#xff0c;而是继续执行后续的代码&#xff0c;等待请求返回后再执行相应的回调函数。常见的异步请求方法包括使用XMLHttpRequest对象&#xff08;XHR&#xff09;和fetch API。 异步请求的方法 1. XMLHttpRequest (X…...

SpringCloud入门(六)Nacos注册中心(下)

一、Nacos环境隔离 Nacos提供了namespace来实现环境隔离功能。 nacos中可以有多个namespace。namespace下可以有group、service等。不同namespace之间相互隔离&#xff0c;例如不同namespace的服务互相不可见。 使用Nacos Namespace 环境隔离 步骤&#xff1a; 1.在Nacos控制…...

【RDMA】mlxlink检查和调试连接状态及相关问题--驱动工具

简介 mlxlink工具用于检查和调试连接状态及相关问题。该工具可以用于不同的链路和电缆&#xff08;包括被动、电动、收发器和背板&#xff09;。 属于mft工具套件的一个工具&#xff0c;固件工具 Firmware Tools (MFT):https://blog.csdn.net/bandaoyu/article/details/14242…...

QT For Android开发-打开PPT文件

一、前言 需求&#xff1a; Qt开发Android程序过程中&#xff0c;点击按钮就打开一个PPT文件。 Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件&#xff0c;非常方便。QDesktopServices提供了静态接口调用系统级别的功能。 这里用的QDesk…...

SpringBoot教程(三十) | SpringBoot集成Shiro权限框架

SpringBoot教程&#xff08;三十&#xff09; | SpringBoot集成Shiro权限框架 一、 什么是Shiro二、Shiro 组件核心组件其他组件 三、流程说明shiro的运行流程 四、SpringBoot 集成 Shiro &#xff08;shiro-spring-boot-web-starter方式&#xff09;1. 添加 Shiro 相关 maven2…...

[ffmpeg] 视频格式转换

本文主要梳理 ffmpeg 中的视频格式转换。由于上屏的数据是 rgba&#xff0c;编码使用的是 yuv数据&#xff0c;所以经常会使用到视频格式的转换。 除了使用 ffmpeg进行转换&#xff0c;还可以通过 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 …...

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展&#xff1a;回归与回溯 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …...

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样&#xff0c;可以在不知道对象具体类型的条…...

在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路

什么是vitepress vitepress是一种将markdown文件渲染成静态网页的技术 其使用仅需几行命令即可 //在根目录安装vitepress npm add -D vitepress //初始化vitepress&#xff0c;添加相关配置文件&#xff0c;选择主题&#xff0c;描述&#xff0c;框架等 npx vitepress init //…...

神经网络面试题目

1. 批规范化(Batch Normalization)的好处都有啥&#xff1f;、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是&#xff1a;A 解析&#xff1a; ‌‌‌‌  batch normalization 就…...

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况&#xff0c;而本道题是出现两个单身狗的情况。根据一个数…...

Vue2学习笔记(03关于VueComponent)

1.school组件本质是一个名为Vuecomponent的构造函数&#xff0c;且不是程序员定义的&#xff0c;是Vue.extend生成的。 2.我们只需要写<school/>或<school></school>&#xff0c;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框架简…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...