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

这篇具有很好参考价值的文章主要介绍了Observability:如何有效地将应用日志发送到 Elasticsearch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

介绍

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

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

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

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

Observability:如何有效地将应用日志发送到 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

Observability:如何有效地将应用日志发送到 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 或其他节拍的情况下发送日志。

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

 为了能够将日志发送到 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 日志及指标”。

结论

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

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

 

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

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

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

更多阅读:Beats:Elastic Beats 介绍 及和 Logstash 的比较​​​​​​​文章来源地址https://www.toymoban.com/news/detail-489563.html

到了这里,关于Observability:如何有效地将应用日志发送到 Elasticsearch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在 3Ds Max 中准确地将参考图像调整为正确的尺寸?

    您是否想知道如何在 3Ds Max 中轻松直观地调整参考图像的大小,而无需借助第三方解决方案、插件或脚本? 我问自己这个问题,并高兴地发现了 FFD Box 2x2x2 ,我无法停止钦佩这个修改器的多功能性。 在本文中,我想与您分享一种简单明了的方法,使您能够在 3Ds Max 中快速有

    2024年02月12日
    浏览(40)
  • APP应用加固指南:如何有效辨别,网络上伪造的地理位置?

    在数字互联时代,已经离不开地理位置数据。地理位置数据不仅仅是一个简单的坐标,更是一种数字足迹,描绘了人们在数字世界中的实际存在。这些数据为我们提供了关键的背景信息,让人们在享受数字服务的同时,也能更好地理解人们的生活环境。     首先,基于地理位

    2024年02月04日
    浏览(49)
  • Observability:如何把 Elastic Agent 采集的数据输入到 Logstash 并最终写入到 Elasticsearch

    在之前的文章 “安装独立的 Elastic Agents 并采集数据 - Elastic Stack 8.0”,我们详述了如何使用 No Fleet Server 来把数据写入到 Elasticsearch 中。在今天的文章中,我们来详述如下使用 Elastic Agents 在独立(standalone)模式下来采集数据并把数据最终通过 Logstash 来写入到 Elasticsearch 中去

    2024年02月11日
    浏览(54)
  • 图形数据库的实战应用:如何在 Neo4j 中有效管理复杂关系

    关系数据库管理系统( RDBMS ) 代表了最先进的技术,这在一定程度上要归功于其由周边技术、工具和广泛的专业技能组成的完善的生态系统。 在这个涵盖信息技术(IT) 和运营技术(OT) 的技术革命时代,人们普遍认识到性能方面出现了重大挑战,特别是在NoSQL 解决方案优于传统方

    2024年02月03日
    浏览(58)
  • TCP解帧解码、并发送有效数据到FPGA

    工程的功能:使用TCP协议接收到网络调试助手发来的指令,将指令进行解帧,提取出帧头、有限数据、帧尾;再将有效数据发送到FPGA端的BRAM上,实现信息传递。 参考:正点原子启明星ZYNQ之嵌入式SDK开发指南_V2.0:第三十九章 基于 TCP 协议的远程更新 QSPI Flash 实验 和 第十五

    2024年02月05日
    浏览(39)
  • FPGA串口接收解帧、并逐帧发送有效数据——1

    工程实现的功能:FPGA串口接收到串口调试助手发来的数据,将其数据解帧。判断到正确的帧头和帧尾之后,将有效数据存入rx_data中;另一方面发送端将有效数据逐帧发送出去。 参考:正点原子官方FPGA串口通信实验 模块构成: 在原子哥的基础上改的代码。 添加了接收状态机

    2024年02月05日
    浏览(40)
  • FPGA串口接收解帧、并逐帧发送有效数据-2

    工程实现的功能:FPGA串口接收到串口调试助手发来的数据,将其数据解帧。判断到正确的帧头和帧尾之后,将有效数据存入rx_data中;另一方面发送端将有效数据逐帧发送出去。 参考:正点原子官方FPGA串口通信实验 模块构成: 在原子哥的基础上改的代码。 添加了接收状态机

    2024年02月05日
    浏览(37)
  • 有效日志管理在软件开发和运营中的作用

    作者:Luca Wintergerst, David Hope, Bahubali Shetti 当今存在的快速软件开发过程需要扩展和复杂的基础架构和应用程序组件,并且操作和开发团队的工作不断增长且涉及多个方面。 有助于管理和分析遥测数据的可观察性是确保应用程序和基础架构的性能和可靠性的关键。 特别是,日

    2024年02月02日
    浏览(42)
  • 环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】

    目录 一、环形链表 方法(快慢指针): 二、环形链表 II 三、有效的括号 给你一个链表的头节点  head  ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪  next  指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数  pos  来

    2024年02月03日
    浏览(42)
  • (保姆级解决方案)微信小程序【真机预览】无法向服务器发送请求(实测有效)

    问题描述:微信小程序“打开调试模式可以发出请求,关闭调试模式无法发出请求” 1 获取uni-cloud官网提供的request合法域名  这个获取request合法域名是针对使用uni-cloud云开发的小程序。如果使用其它合法域名,同样可以按照下面的方法解决问题。  uni-app官网  2 在微信小程

    2024年02月05日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包