日志系统实践

日志系统

画板

产生日志

logging:level:root: infoconfig: /usr/src/config/logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="ch.qos.logback.contrib.json.classic.JsonLayout"><timestampFormat>yyyy-MM-dd HH:mm:ss.SSS</timestampFormat><timestampFormatTimezoneId>Asia/Shanghai</timestampFormatTimezoneId><jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter"><prettyPrint>false</prettyPrint></jsonFormatter><appendLineSeparator>true</appendLineSeparator></layout></encoder></appender><root level="info"><appender-ref ref="STDOUT" /></root></configuration>

以下是对这段Logback配置文件内容的详细解释:

1. 整体配置结构说明

这段XML配置文件是用于配置Logback日志框架的,Logback是一个功能强大且广泛使用的Java日志框架,用于控制Java应用中日志的输出格式、级别以及输出目标等方面。整个配置文件围绕着<configuration>根标签展开,在这个根标签内部定义了具体的日志输出相关配置。

2. <appender>标签配置(以“STDOUT”为例)

  • 定义与功能
    <appender>标签用于定义日志的输出目的地以及输出格式等相关内容。在这里定义了一个名为“STDOUT”的appender,其class属性指定为"ch.qos.logback.core.ConsoleAppender",这表明这个appender的作用是将日志输出到控制台(标准输出)。
  • <encoder>子标签及内部配置
    "STDOUT"这个appender内部,包含了一个<encoder>标签,它主要负责对要输出的日志进行编码和格式化处理。
    • <layout>子标签及进一步配置

<encoder>标签内又嵌套了<layout>标签,其class属性设置为"ch.qos.logback.contrib.json.classic.JsonLayout",这意味着会将日志按照JSON格式进行组织和输出。

- **时间戳相关配置**:

<timestampFormat>标签定义了时间戳的格式,设置为"yyyy-MM-dd HH:mm:ss.SSS",也就是按照年-月-日 时:分:秒.毫秒这样精确到毫秒的格式来记录日志产生的时间。同时,<timestampFormatTimezoneId>标签指定了时区为Asia/Shanghai,确保时间戳的显示符合上海所在的东八区时间标准。

- **JSON格式化相关配置**:

<jsonFormatter>标签下的<prettyPrint>设置为false,这表示输出的JSON格式日志不会进行格式化美化(如果为true,则输出的JSON会有缩进等美化排版,方便查看,但会占用更多空间)。另外,<appendLineSeparator>设置为true,说明在每条日志记录后面会添加换行符,使每条日志在控制台输出时各占一行,便于查看和区分不同的日志记录。

3. <root>标签配置

  • 日志级别设定
    <root>标签用于设置整个应用的根日志级别,这里将其设置为"info"级别。这意味着只有日志级别为INFO及以上(如WARNERROR等)的日志记录才会被输出,而低于INFO级别的日志(如DEBUG级别)则会被忽略。
  • 关联的appender引用
    <appender-ref ref="STDOUT" />这一行表示根日志会关联到前面定义的名为"STDOUT"appender,也就是将符合日志级别要求的日志按照"STDOUT"这个appender所定义的格式(JSON格式并输出到控制台等)进行输出。

总的来说,这份配置文件的作用是让Java应用以JSON格式将<font style="color:#DF2A3F;">INFO</font>及以上级别的日志输出到控制台,并且对日志的时间戳、JSON格式的具体样式等做了相应的规范设置,方便后续查看、收集以及分析日志信息。

收集日志

Promtail收集日志的途径不局限于控制台,不过它可以从控制台(标准输出和标准错误输出)收集日志,以下是具体说明:

1. 从控制台收集日志

  • 容器环境中的应用:在容器编排系统(如Kubernetes)中,应用通常会将日志输出到控制台(标准输出和标准错误输出)。Promtail可以通过配置来捕获容器的这些输出。例如,它可以挂载到容器的日志目录或者利用容器运行时(如Docker或containerd)提供的接口来读取标准输出和标准错误输出的日志内容。这种方式非常方便,因为许多容器化的应用默认会将日志输出到控制台,Promtail可以无缝对接这些日志流,将其发送到Loki进行存储和后续查询。
  • 配置文件调整:在Promtail的配置文件中,通过设置scrape_configs部分来指定如何从控制台收集日志。它可以根据标签(如应用名称、容器名称、命名空间等)来区分不同来源的日志。例如,可以设置一个配置,使得Promtail收集某个特定命名空间下所有应用的控制台日志,并为这些日志添加相应的标签,方便在Loki中进行分类查询。

2. 从日志文件收集日志

  • 本地日志文件:Promtail也可以收集存储在本地文件系统中的日志文件。对于那些将日志写入文件而不是输出到控制台的应用,Promtail可以通过配置文件路径来读取日志。在配置文件中,通过positions部分可以记录每个日志文件的读取位置,确保在Promtail重启或者出现故障后能够从上次读取的位置继续收集日志,避免日志的重复收集或遗漏。
  • 支持多种日志格式:无论是纯文本日志还是结构化的日志文件(如JSON格式、XML格式等),Promtail都可以进行收集。它可以根据日志文件的格式进行解析,提取有用的信息作为标签或者元数据发送给Loki。例如,对于一个以JSON格式存储的日志文件,Promtail可以解析其中的字段,如日志级别、时间戳、模块名称等,并将这些信息添加为标签,增强日志在Loki中的查询和分类功能。

3. 与其他系统集成收集日志

  • 接收**推送的日志**:在某些复杂的架构中,其他日志收集或生成系统可能会将日志推送给Promtail。例如,一些自定义的日志收集工具或者中间件可以将收集到的日志发送到Promtail指定的接口,然后Promtail再将这些日志转发给Loki。这种方式可以实现对多种来源日志的统一收集和管理,充分利用Promtail与Loki的集成优势。
  • **消息队列**配合:Promtail还可以与消息队列(如Kafka)集成来收集日志。如果应用将日志发送到消息队列,Promtail可以作为消费者从消息队列中获取日志,然后将其发送给Loki。这样可以实现异步的日志收集,提高系统的整体性能和日志的可靠性,尤其是在高并发或者日志流量较大的场景下。

储存日志

  1. Loki存储架构的主要组件
    • Ingester
      • 内存缓存与处理:Ingester是Loki存储架构中的关键组件之一。它接收从Distributor转发过来的日志数据,并首先将这些日志数据临时存储在内存中。这是一种高效的缓存方式,能够快速处理和索引日志。在内存中,Ingester会为日志数据构建索引,方便后续的查询操作。例如,当收到大量Java应用的日志时,它可以根据日志的元数据(如应用名称、日志级别等)在内存中快速建立索引,使得后续查询特定应用或特定级别日志时能够迅速定位。
      • 批量写入持久化存储:为了防止数据丢失并且实现长期存储,Ingester会按照一定的策略将内存中的日志数据批量写入持久化存储。这个策略通常会考虑内存使用情况、时间间隔或者日志数据量等因素。比如,当内存中日志数据达到一定的大小阈值或者经过一定的时间间隔(如每5分钟),就会将这些日志数据写入持久化存储,确保数据的持久性和可靠性。
    • Indexer
      • 元数据索引维护:Indexer主要负责对日志的元数据进行索引。它接收Ingester发送过来的关于日志元数据的信息,并构建和维护一个高效的索引结构。这个索引结构是基于日志的标签(如应用标签、环境标签等)和其他关键元数据构建的。例如,对于一个包含多个Java应用日志的系统,Indexer可以通过应用名称标签快速定位到某个特定Java应用的所有日志索引,大大提高了查询的速度和效率。
      • 支持高效查询:Indexer的存在使得Loki能够快速响应用户的查询请求。当用户通过Grafana等工具查询日志时,查询请求首先会被发送到Indexer,Indexer利用其维护的索引结构,快速定位到可能包含用户所需日志的Ingester或者存储位置,然后将查询请求转发到相应的位置获取日志数据。
    • Storage(持久化存储)
      • 多种存储后端支持:Loki的存储支持多种后端存储方式,这是它的一个重要优势。它可以使用本地文件系统存储,这种方式适用于小规模的日志存储或者开发测试环境。同时,它也支持云存储服务,如Amazon S3、Google Cloud Storage等。这使得Loki能够在不同的部署场景下灵活选择存储方式,满足不同用户的需求。例如,对于一个大型企业的云原生应用,使用云存储作为Loki的持久化存储可以方便地扩展存储容量,并且利用云存储的高可用性和可靠性特点。
      • 存储数据格式与组织:在存储的数据格式方面,Loki存储的日志数据是经过压缩的非结构化日志。这种存储方式降低了对存储资源的要求,因为它不需要像传统数据库那样对日志内容进行复杂的结构化存储。日志数据在存储时会按照一定的规则进行组织,通常与元数据索引相关联,以便在查询时能够快速定位和提取相关的日志内容。
  2. 为什么适合储存日志
    • 轻量级索引机制
      • 降低资源需求:Loki仅对日志的元数据进行索引,而不是像传统的日志系统那样对整个日志内容进行全文索引。这大大减少了索引的大小和复杂度,从而降低了对存储资源和计算资源的需求。对于存储大量日志的场景,如大规模的Java应用集群产生的海量日志,这种轻量级索引机制可以节省大量的存储空间和索引维护成本。
      • 快速查询元数据:通过对元数据(如日志产生的时间、应用名称、日志级别等)进行索引,能够快速定位到相关的日志。例如,当需要查询一个Java应用在特定时间段内的ERROR级别日志时,Loki可以通过元数据索引迅速筛选出符合条件的日志,而不需要在大量的日志内容中进行全文搜索。
    • 高效的存储方式
      • 压缩非结构化日志存储:Loki存储压缩的非结构化日志,这种方式充分利用了日志数据的特点。日志通常是文本形式,内容格式相对灵活,非结构化存储可以避免复杂的结构化存储带来的开销。同时,压缩存储可以进一步减少存储空间的占用,使得在有限的存储资源下能够存储更多的日志数据。
      • 支持多种存储后端:如前面提到的,Loki支持多种存储后端,用户可以根据自己的实际情况选择合适的存储方式。无论是本地存储用于简单的测试环境,还是云存储用于大规模的生产环境,都可以灵活适配,这使得Loki在不同规模和类型的日志存储场景中都具有很好的适用性。
    • 与日志收集和查询流程紧密结合
      • 从收集到存储的一体化流程:**Loki的存储架构与日志收集工具(如Promtail)紧密配合。**Promtail收集日志并添加标签等元数据,这些元数据可以直接被存储架构中的Ingester和Indexer利用,构建索引和存储日志。这种一体化的流程减少了数据在收集和存储过程中的转换和处理成本,提高了日志存储的效率。
      • 方便的查询语言支持:Loki提供了**LogQL(日志查询语言)**,它与存储架构紧密结合。用户可以通过LogQL方便地查询存储在Loki中的日志,并且查询请求能够高效地在存储架构中得到处理。例如,用户可以使用LogQL查询特定Java应用在某个容器中的日志,存储架构能够根据查询请求快速定位并返回相关日志,满足用户在日志查询和分析方面的需求。

检索日志

Grafana是一个开源的、功能强大的度量分析与可视化工具,在数据监控和可视化领域应用广泛。以下是关于它的详细介绍:

1. 功能特点

  • 多样化的数据源支持
    • Grafana可以连接多种不同类型的数据源,包括但不限于**时间序列数据库(如Prometheus【监控系统中使用,也会与grafana集成】、InfluxDB)、关系型数据库(如MySQL、PostgreSQL)日志数据库(如Loki)**以及一些云服务的监控数据(如AWS CloudWatch、Google Cloud Monitoring)。这种广泛的数据源兼容性使得它能够整合来自不同系统的数据,为用户提供一个统一的数据分析和可视化平台。
    • 例如,**对于一个同时使用Prometheus存储系统指标数据和Loki存储日志数据的复杂系统,Grafana可以同时连接这两个数据源【目前系统中就是这样使用的】,**通过在一个仪表盘中展示指标图表和日志信息,帮助运维人员和开发人员更全面地了解系统状态。
  • 丰富的可视化选项
    • 它提供了多种可视化方式,如折线图、柱状图、饼图、状态指示灯、热图、地理地图等。用户可以根据数据的性质和分析目的选择最合适的可视化方式。例如,用折线图展示服务器CPU使用率随时间的变化趋势,用饼图展示不同业务模块的资源占用比例。
    • Grafana还支持自定义可视化布局,用户可以在一个仪表盘中组合多个不同类型的可视化组件,以创建个性化的监控和分析界面。例如,在一个Web应用性能监控仪表盘中,可以同时展示页面加载时间的折线图、接口响应时间的柱状图以及错误率的状态指示灯。
  • 强大的查询编辑器和变量功能
    • 其查询编辑器允许用户针对不同的数据源编写查询语句,以提取和处理所需的数据。对于不同的数据源,如Prometheus使用PromQL、InfluxDB使用InfluxQL等,Grafana都提供了相应的支持,方便用户灵活地获取数据。
    • 变量功能则进一步增强了查询的灵活性和复用性。用户可以定义变量来代表数据源中的某些字段(如服务器名称、应用版本等),然后在查询和可视化组件中使用这些变量。这样,当需要查看不同服务器或者不同版本应用的数据时,只需改变变量的值,而无需修改整个查询和可视化设置。
  • 告警功能
    • Grafana具备灵活的告警机制,用户可以基于数据查询结果设置告警规则。当数据满足一定的条件(如某个指标超过阈值、日志中出现特定的错误信息)时,Grafana可以通过多种方式发送告警通知,包括电子邮件、Slack消息、短信(通过与相关服务集成)等。
    • 例如,当服务器的内存使用率超过90%或者关键业务接口的错误率达到5%时,Grafana可以及时通知运维团队,以便他们能够快速采取措施解决问题。

2. 架构与组件

  • 后端存储与数据处理
    • Grafana本身主要是一个前端应用,但它与后端数据源紧密协作。数据存储在各种数据源中,Grafana通过HTTP请求与这些数据源进行通信,获取数据并在前端进行展示和处理。它本身也有一些轻量级的后端存储,用于保存用户的配置信息(如仪表板设置、数据源配置、告警规则等)。
  • 插件系统
    • Grafana拥有丰富的插件生态系统,这些插件可以扩展其功能。插件分为多种类型,包括数据源插件(用于支持新的数据源类型)、面板插件(提供新的可视化方式)和应用插件(提供更复杂的功能集成,如与特定的监控系统深度整合)。
    • 例如,通过安装特定的插件,可以让Grafana支持更多特殊的数据格式或者展示一些行业特定的可视化图表。

3. 应用场景

  • 系统监控与运维管理
    • 在数据中心或云计算环境中,用于监控服务器的性能指标(如CPU使用率、内存使用率、磁盘I/O等)、网络设备的流量和状态、容器化应用的资源使用情况(在Kubernetes等环境中)等。运维人员可以通过Grafana仪表盘实时观察系统状态,及时发现性能瓶颈和故障隐患。
  • 业务数据分析与洞察
    • 对于企业的业务数据,如销售数据、用户行为数据等,Grafana可以帮助业务分析师和管理层将数据进行可视化展示。通过直观的图表和报表,分析业务趋势、用户增长情况、产品受欢迎程度等,为企业决策提供数据支持。
  • 应用性能监控(APM)
    • 在软件开发和部署过程中,用于监控应用程序的性能指标,如Web应用的页面加载时间、接口响应时间、服务调用链路等。开发人员可以通过Grafana快速定位性能问题,优化应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/1660.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的智能停车场管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

如何选择Ubuntu版本

一、为什么要选择Ubuntu系统&#xff1f; CentOS官方已全面停止维护CentOS Linux项目 。具体来说&#xff0c;CentOS 8已于2021年12月31日停止维护&#xff0c;而CentOS 7则在2024年6月30日结束了生命周期 。这意味着这些版本不再接收官方的安全更新、bug修复或技术支持 二、…

Elasticsearch ES|QL 地理空间索引加入纽约犯罪地图

可以根据地理空间数据连接两个索引。在本教程中&#xff0c;我将向你展示如何通过混合邻里多边形和 GPS 犯罪事件坐标来创建纽约市的犯罪地图。 安装 如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话&#xff0c;请参考如下的链接来进行安装。 如何在 Linux&#xff0…

分布式缓存redis

分布式缓存redis 1 redis单机&#xff08;单节点&#xff09;部署缺点 &#xff08;1&#xff09;数据丢失问题&#xff1a;redis是内存存储&#xff0c;服务重启可能会丢失数据 &#xff08;2&#xff09;并发能力问题&#xff1a;redis单节点&#xff08;单机&#xff09;部…

【ArcGIS初学】产生随机点计算混淆矩阵

混淆矩阵&#xff1a;用于比较分类结果和地表真实信息 总体精度(overall accuracy) :指对角线上所有样本的像元数(正确分类的像元数)除以所有像元数。 生产者精度(producers accuracy) &#xff1a;某类中正确分类的像元数除以参考数据中该类的像元数(列方向)&#xff0c;又称…

C++ STL之容器介绍(vector、list、set、map)

1 STL基本概念 C有两大思想&#xff0c;面向对象和泛型编程。泛型编程指编写代码时不必指定具体的数据类型&#xff0c;而是使用模板来代替实际类型&#xff0c;这样编写的函数或类可以在之后应用于各种数据类型。而STL就是C泛型编程的一个杰出例子。STL&#xff08;Standard …

GitLab本地服务器配置ssh和克隆项目

1. 本地安装好git git链接&#xff1a;https://git-scm.com/downloads/win 无脑点击下一步安装即可,打开Git Bash命令终端如下&#xff1a; 2. 配置本地用户名和邮箱 git config --global user.name "你的名字" git config --global user.email "你的邮箱&quo…

【Unity高级】一文了解Unity 中的条件编译(附所有指令)

一、Unity中的条件编译 Unity 对 C# 语言的支持包括使用指令&#xff0c;这些指令允许您根据是否定义了某些脚本符号&#xff0c;选择性地包含或排除代码的编译。有关这些指令在 C# 中如何工作的更多信息&#xff0c;请参阅微软关于 C# 预处理器指令 的文档。 &#xff08;一…

主数据系统建设模式分析

很多企业在长期的信息化建设和使用过程中&#xff0c;或多或少的存在数据一致性问题&#xff0c;这类问题导致了大量的数据手工梳理、清洗的工作&#xff0c;对于系统的对接以及统计分析造成了极大的不便&#xff0c;因此信息化部门的管理者迫切的想通过主数据项目来解决目前的…

Redis是单线程还是多线程?

大家好&#xff0c;我是锋哥。今天分享关于【Redis是单线程还是多线程&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis是单线程还是多线程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis是 单线程 的。 尽管Redis的处理是单线程的&a…

UML系列之Rational Rose笔记一:用例图

好久没有更新笔记了&#xff1b;最近想整理下近期掌握的UML软件建模的知识笔记&#xff1b; 包括但不限于Rational Rose&#xff1b;Drawio&#xff1b;EA&#xff1b;PowerDesigner&#xff1b;Visio&#xff1b;StarUML&#xff1b;Software等软件的使用&#xff1b;UML软件…

熵权法(变异系数法)

熵权法(变异系数法) 一种客观赋权方法&#xff0c;它根据指标的变异程度来确定指标的权重&#xff0c;变异程度越大&#xff0c;说明该指标所包含的信息量越大&#xff0c;相应的权重也就越大。以下是熵权法的详细介绍&#xff1a; 概率与信息量的关系 概率P(x)越小,信息量I(…

基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台

项目是一个基于当前最前沿的前端技术栈&#xff08;Vue3 Vite Ant Design Vue&#xff0c;简称Antdv&#xff09;和后台技术栈&#xff08;Spring Boot&#xff09;实现的低代码开发平台。以下是对该项目的详细介绍&#xff1a; 一、项目概述 项目名称&#xff1a;lowcode-s…

JAVA:利用 RabbitMQ 死信队列实现支付超时场景的技术指南

1、简述 在支付系统中&#xff0c;订单支付的超时自动撤销是一个非常常见的业务场景。通常用户未在规定时间内完成支付&#xff0c;系统会自动取消订单&#xff0c;释放相应的资源。本文将通过利用 RabbitMQ 的 死信队列&#xff08;Dead Letter Queue, DLQ&#xff09;来实现…

逻辑测试题

https://blog.csdn.net/qq_39081315/article/details/121393597 先生成一个点&#xff0c;每生成一个点判断距离&#xff0c;角度&#xff0c;满足加入存点的容器&#xff0c;直到容器大小为4。 随机生成点&#xff1a; 分区域&#xff1a;最大距离20&#xff0c;以20为正方形…

图解Git——分支开发工作流《Pro Git》

分支开发工作流 由于分支管理的便捷&#xff0c; 才衍生出这些典型的工作模式&#xff0c;你可以根据项目实际情况选择。 1. 长期分支 适用于持续开发和发布周期长的项目。常见的长期分支包括&#xff1a; master&#xff1a;只保留稳定的代码&#xff0c;通常用于生产环境。…

IOS界面传值-OC

1、页面跳转 由 ViewController 页面跳转至 NextViewController 页面 &#xff08;1&#xff09;ViewController ViewController.h #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend ViewController.m #import "ViewController.h" …

【Spring Boot 应用开发】-04-01 自动配置-数据源-连接池

资源关闭 还记得上一节中的这段代码么&#xff1f; try {if (resultSet ! null) resultSet.close();if (preparedStatement ! null) preparedStatement.close();if (connection ! null) connection.close(); } catch (SQLException e) {e.printStackTrace(); }这是我们在查询…

BUUCTF:misc刷题记录4(会持续更新的)

目录 爱因斯坦 ningen 做题总结&#xff1a; 爱因斯坦 下载解压后&#xff0c;得到一张图片。 老套路&#xff0c;还是先查看一下图片基本属性。只看到这串信息&#xff0c;不知道有啥用。 然后用010进行查看 发现图片里面隐藏了一个压缩包&#xff0c;压缩包里面有个flag.t…

Open FPV VTX开源之嵌入式OSD配置

Open FPV VTX开源之嵌入式OSD配置 1. 源由2. 安装3. 配置步骤一&#xff1a;备份/etc/telemetry.conf步骤二&#xff1a;修改/etc/telemetry.conf步骤三&#xff1a;配置时区步骤四&#xff1a;重启摄像头 4. 实测5. 参考资料 1. 源由 穿越机模拟图传延迟通常在10ms左右。 最…