Observability:如何有效地将应用日志发送到 Elasticsearch

news2024/12/27 9:22:53

 在今天的文章中,我们将探讨使用 3 种不同的架构发送应用的日子到 Elasticsearch。我们将详述它们的优缺点。更多关于日志架构的介绍,请参考 “Elastic:开发者上手指南” 中的 “Elastic Stack 架构” 部分。

介绍

采用 Elastic Stack,应用程序日志发送到 Elasticsearch 有三种不同架构,每种架构各有优缺点:

  • 应用程序 -> Filebeat -> Logstash -> Elasticsearch
  • 应用程序 -> Filebeat -> Elasticsearch
  • 应用程序 (Java) + Logstash-logback-encoder -> Logstash -> Elasticsearch

虽然可能还有其他发送日志的方法,但根据我的经验,将这些方法结合起来可以满足任何业务需求。

1)Application -> Filebeat -> Logstash -> Elasticsearch

这是将日志发送到 Elasticsearch 的标准方法,因为它为你提供了很多控制权。 你甚至可以更改将日志发送到另一个 Logstash 或 Elasticsearch 服务器的路径。 这是示例 filebeat.yml 配置文件:

filebeat.inputs:
- type: log
  paths:
    - "myapp.log"

output.logstash:
  hosts: ["192.168.1.1:4561"]

以及用于接收 Filebeat 日志的 logstash.conf 文件:

input {
  beats {
    port => "4561"
    host => "0.0.0.0"
  }
}

filter { }

output {
  elasticsearch {
    hosts => ["0.0.0.0:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
}

这种架构的优点是:

  • 控制:你对日志采用的路径有很多控制权。我们可以在 Filebeat 中使用 Beat processors 来对数据进行处理,也可以使用 Logstash 丰富的过滤器来对数据进行加工。Logstash 可以对数据的摄入进行缓冲,并使用永久行队列对数据进行至少一次的发送。
  • 无需修改代码:你无需更改应用程序代码即可发送日志。

这种架构的缺点是:

  • 性能问题:存储日志涉及多个步骤,这会影响性能。
  • 磁盘加载:应用程序将日志写入文件,Filebeat 读取该文件。 当应用程序实例数量增加时,这可能会导致磁盘负载过重。

2)Application -> Filebeat -> Elasticsearch

使用这种方法,你可以从日志发送路径中消除 Logstash,并将日志直接发送到 Elasticsearch。 如果你的日志是 JSON 格式并且已清理,则此方法效果很好。

下面是一个示例 filebeat.yml 配置文件,它读取日志文件并将它们发送到 Elasticsearch:

filebeat.inputs:
- type: log
  paths:
    - "myapp.log"

output.elasticsearch:
  hosts: ["http://192.168.1.1:9200"] 

这种方法的优点:

  • 提高性能:通过消除 Logstash,你可以减少日志发送路径中的一个步骤。
  • 无需修改代码:你无需更改应用程序代码即可发送日志。

这种方法缺点:

  • 对日志修改的控制有限:Logstash 提供了许多工具,用于在将日志存储到 Elasticsearch 之前解析和清理日志。 没有它,你对日志修改的控制就会减少。

 3)Application (Java) + Logstash-logback-encoder -> Logstash -> Elasticsearch

如果你有 Java 应用程序,则可以使用这种方法将日志直接发送到 Logstash,而无需任何解释器。 确实可以在不需要 Filebeat 或其他节拍的情况下发送日志。

 为了能够将日志发送到 Logstash,你需要配置您的 Java 应用程序。 首先,将此依赖项添加到你的 pom.xml 文件中:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.3</version>
    <scope>runtime</scope>
</dependency>

然后你需要像这样向你的 logback.xml 文件添加一个新的附加程序

<property name="STACK_TRACE_COUNT" value="15"/>
<property name="CLASS_NAME_LENGTH" value="40"/>

<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
   <destination>192.168.1.1:4560</destination>
   <addDefaultStatusListener>false</addDefaultStatusListener>

    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
       <providers>
           <pattern>
               <pattern>{"app_name": "myapp", "app_version":"1.0.0", "hostname": "${HOSTNAME}"}</pattern>
           </pattern>
           <mdc/>
           <timestamp/>
           <message/>
           <threadName/>
           <logLevel/>
           <callerData/>
           <stackTrace>
               <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                   <maxDepthPerThrowable>${STACK_TRACE_COUNT}</maxDepthPerThrowable>
                   <shortenedClassNameLength>${CLASS_NAME_LENGTH}</shortenedClassNameLength>
                   <rootCauseFirst>true</rootCauseFirst>
               </throwableConverter>
           </stackTrace>
       </providers>
   </encoder>
</appender>


<root level="${ROOT_LEVEL}">
   <appender-ref ref="CONSOLE"/>
   <appender-ref ref="LOGSTASH"/>
</root>

我们使用 LogstashTcpSocketAppender 类而不是 UDP 类,因为我需要确保在将日志发送到 Logstash 的过程中不会丢失任何日志。 但是,如果你不关心这种级别的可靠性,则可以使用 UDP。

另一方面,Logstash 应该配置为接收日志,并将它们存储在 Elasticsearch 等位置。 这是我当前使用的示例 Logstash 配置:

input {
    tcp {
        port => 4560
        codec => json_lines
    }
}

filter { }

output {
    
    elasticsearch {
        hosts  => ["http://elasticsearch:9200"]
        index  => "operationlog-%{app_name}-%{+YYYY-MM-dd}"
    }   
}

这个方法的优点:

  • 性能提升:通过将日志直接发送到 Logstash 而不是将它们存储在磁盘上,这种方法与以前的方法相比具有更少的开销。

这个方法的缺点:

  • 限制:logstash-logback-encoder 只能与 Java 应用程序一起使用。
  • 代码修改要求:要使用这种方法,你需要修改应用程序代码。
     

针对 Python 应用,你可以参考文章 “Elasticsearch:运用 Python 实时通过 Logstash 写入日志到 Elasticsearch”

其它方法

  • 当然除了上面的方法之外,我们还可以直接使用 Logstash 来收集日志。请详细阅读文章 “Logstash:如何使用 Elasticsearch,Logstash 和 Kibana 管理 Apache 日志”。它的优点是可以使用 Logstash 所带来的强大的过滤器来对数据进行处理。在实际的使用中,我们甚至可以搭配 kafka 来对数据进行缓存。更多架构方面的知识,请阅读   “Elastic:开发者上手指南” 中的 “Elastic Stack 架构” 部分。
  • 在最新的 Elastic Stack 发布中,我们更倾向于使用 Elastic Agent 来收集指标及日志信息。详细阅读,请参阅 “Observability:运用 Fleet 来轻松地导入 Nginx 日志及指标”。

结论

你可以将上述所有方法组合到一个架构中,如下所示:

 

如果要从 Java 应用程序发送日志,可以使用 logstash-logback-encoder 将它们直接发送到 Logstash,而无需将它们存储在磁盘上。

清理 Python 或 NodeJS 应用日志路径中的数据,可以结合使用 Filebeat 和 Logstash。 但是,如果你的数据已经是 JSON 格式,则无需使用 Logstash。 你只需将日志发送到 Filebeat,然后 Filebeat 会将它们存储在 Elasticsearch 中。

特别指出:针对日志中的数据处理,除了使用 Filebeat 中的 processors 以及 Logstash 中的过滤器,我们还可以使用 Elasticsearch 摄入节点所提供的 ingest pipeline 来对数据进行清洗。

更多阅读:Beats:Elastic Beats 介绍 及和 Logstash 的比较​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端录制回放rrweb

rrweb 是 ‘record and replay the web’ 的简写&#xff0c;旨在利用现代浏览器所提供的强大 API 录制并回放任意 web 界面中的用户操作。 rrweb中文文档 https://github.com/rrweb-io/rrweb/blob/master/guide.zh_CN.md 本文项目地址 https://github.com/qdfudimo/vue-rrweb…

网安学习|Kail安全渗透测试系统之【前期信息收集】工具实践学习

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1a;[ https://www.weiyigeek.top ] 博客&…

达梦数据库与MySQL的区别及语法差异

达梦数据库与MySQL的区别及其SQL语句对比 简介&#xff1a;正文&#xff1a;1. 达梦数据库和MySQL的概述2. 特点对比3. SQL语句对比1. 数据类型&#xff1a;2. 语法&#xff1a;1. DDL&#xff08;数据定义语言&#xff09;的差异&#xff1a;2. DML&#xff08;数据操作语言&a…

面向对象——多态、抽象类、接口

学习资料来自&#xff1a;黑马程序员&#xff0c;内容仅为学习记录&#xff0c;侵删 多态 多态&#xff1a;事务存在的多种形态 多态的前提&#xff1a;1、有继承关系&#xff1b;2、重写父类方法&#xff1b;3、父类引用指向子类对象 面向对象 面向对象多态中成员访问特点…

动态测试数据处理

分类 动态测试数据&#xff1a; 1、确定性数据&#xff1a;能够用明确的数学表达式进行描述的数据称为确定性数据。 Ⅰ、周期数据 Ⅱ、非周期数据 2、随机性数据&#xff1a;无法用明确的数学表达式表述&#xff1b;若在一个…

强大的工具:APISpace IP归属地查询API

引言 IP地址在互联网世界中扮演着重要的角色&#xff0c;对于许多应用程序和服务来说&#xff0c;了解IP地址的归属地信息可以提供有价值的洞察和功能。 在本文中&#xff0c;我们将介绍一种名为IP归属地-IPv4区县级 API 的强大工具&#xff0c;它提供了查询 IP 地址归属地信…

如何解释物联网IOT平台?

物联网开发的本质是将各种物品通过网络连接在一起&#xff0c;并对这些物品进行数字化管理&#xff0c;从而实现智能自动化。在物联网的早期阶段&#xff0c;一些物联网应用程序&#xff08;例如&#xff0c;智能电表&#xff09;使用软件将信息传输到后台服务器。但随着时间的…

华为路由器:多区域OSPF协议实验

一、实验拓扑 二、ospf基本概念复习 区域划分&#xff1a;area0为骨干区域&#xff0c;其他area1、area2都为普通区域/常规区域。普通区域必须和骨干区域直接相连。ABR&#xff1a;区域边界路由器。R2、R3位于两个区域的中间&#xff0c;我们称之为区域边界路由器 &#xff1b…

ObjectARX如何监控实体双击事件(利用钩子函数或者反应器)

目录 1 实现方法1——钩子函数1.1 钩子函数的作用1.2 利用钩子函数监控双击事件 2 实现方法2——反应器2.1 反应器的作用2.2 利用编辑器反应器监控双击事件 在ObjectARX开发中&#xff0c;常常要监控鼠标的双击事件&#xff0c;比如&#xff0c;往一个实体中写了扩展数据&#…

基于html+css的图展示115

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

2023年湖北下半年中级职称申报中级职称评审申报条件是什么?

2023年湖北下半年中级职称申报中级职称评审申报条件是什么&#xff1f; 2023年湖北中级职称申报条件&#xff1a;本科毕业5年&#xff0c;专科毕业7年&#xff0c;相关专业 助工满4年这个条件目前不是硬性要求&#xff0c;意思就是有肯定更好&#xff0c;没有也没有太大的影响 …

穿越火线几次体验良好的游戏优化方案

文章目录 介绍救世主模式终结者模式30人生化模式挑战模式英雄级武器源武器英雄级武器皮肤英雄级武器游戏玩偶英雄级武器万化包、光效英雄级武器强化英雄级武器音效卡免费获取挑战强化武器戒指击杀效果个人竞技击杀效果人机训练模式交易所火线币快速加入跳跳乐爆头战HS间谍模式地…

做了一个日内信号可视化系统

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;半年过去了。松鼠Quant计划6月内发布本年度最重要的一个策略:盘口策略。这个策略群友们的呼声很高&#xff0c;也是花了比较多时间去弄。整个策略有多个python脚本: CTP数据生成order…

如何提高浪涌保护器的使用寿命和安全性

浪涌保护是保护设施免受电气事件影响的基本要求。具体来说&#xff0c;浪涌保护器&#xff08;SPD&#xff09;旨在限制瞬态电压并转移浪涌电流以保护系统和设备。 SPD浪涌保护器必须考虑的一种现象是临时过电压&#xff08;TOV&#xff09;。传统设备处理 TOV 的方式可能会导…

【unity数据持久化】游戏排行榜信息简单的存储,你还知道吗?数据管理类_PlayerPrfs

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

谈一谈冷门的C语言爬虫

C语言可以用来编写爬虫程序&#xff0c;但是相对于其他编程语言&#xff0c;C语言的爬虫开发可能会更加复杂和繁琐。因为C语言本身并没有提供现成的爬虫框架和库&#xff0c;需要自己编写网络请求、HTML解析等功能。 不过&#xff0c;如果你对C语言比较熟悉&#xff0c;也可以…

FPGA认识-LCMXO3LF-9400C-5BG400C 什么是低功耗FPGA

莱迪思深力科超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA&#xff0c;采用先进的封装技术&#xff0c;能让每个元件达到最低成本。此系列采用最新的小型封装&#xff0c;不仅具有低功率、成本优势并结合快速效能。FPGA 现场可编程逻辑器件,小尺寸&#xff0c;高…

SSRS rdlc报表 八 报表项目部署

开发环境 vs2022 sqlserver 2019 windows 11 参考文档&#xff1a;安装 SQL Server Reporting Services - SQL Server Reporting Services (SSRS) | Microsoft Learn 配置 URL (Configuration Manager) - SQL Server Reporting Services (SSRS) | Microsoft Learn 项目右键…

问道价值互联网,区块链的下一个十年 | 2023 开放原子全球开源峰会区块链分论坛即将启幕

随着全球 Web3 浪潮经由数字藏品、元宇宙的日渐普及而实现落地&#xff0c;区块链在“信息互联网”转向“价值互联网”中的重要作用正得到进一步认可。在数字经济蓬勃发展、数据成为重要生产要素的时代&#xff0c;区块链已不仅仅是一项技术、一种工具&#xff0c;更是一种思维…

大型城市综合体建筑智能消防应急照明和疏散系统的具体应用 安科瑞 许敏

摘要&#xff1a;随着我国社会经济的迅猛发展与城市化建设进程的加快&#xff0c;大型城市综合体建筑越来越多&#xff0c;随之而来的消防安全管理问题不容忽视。智能消防应急照明和疏散系统作为保证人员安全疏散不可或缺的消防设施&#xff0c;是保障消防安全的重要组成部分。…