ElasticSearch-ELK

news2024/12/23 8:30:00
  • Logstash
    • Logstash 配置文件结构
    • Logstash 导入数据到 ES
    • 同步数据库数据到 ES
  • FileBeat
  • ELK(采集 Tomcat 服务器日志)
    • 使用FileBeats将日志发送到Logstash
    • Logstash输出数据到Elasticsearch(logstash开头的索引)
      • 利用Logstash过滤器解析日志
        • 使用Grok插件通过模式匹配的方式来识别日志中的数据
        • 使用mutate插件过滤掉不需要的字段
        • 使用Date插件将日期格式进行转换
    • 输出到Elasticsearch指定索引
    • 完整的Logstash配置文件

Logstash

  • Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到存储库

  • Pipeline

    • 包含了 input-filter-output 三个阶段的处理流程
    • 插件生命周期管理
    • 队列管理
  • Logstash Event

    • 数据在内部流转时的具体表现形式:数据在 input 阶段被转换为 Event,在 output 被转化成目标格式数据
    • Event 其实是一个 Java Object,在配置文件中,对 Event 的属性进行增删改查
  • Codec (Code / Decode):将原始数据decode成Event;将Event encode成目标数据

    • 在这里插入图片描述
  • Logstash数据传输原理

    • 数据采集与输入:Logstash支持各种输入选择,能够以连续的流式传输方式,轻松地从日志、指标、Web应用以及数据存储中采集数据
    • 实时解析和数据转换:通过Logstash过滤器解析各个事件,识别已命名的字段来构建结构,并将它们转换成通用格式,最终将数据从源端传输到存储库中
    • 存储与数据导出:Logstash提供多种输出选择,可以将数据发送到指定的地方
  • Logstash通过管道完成数据的采集与处理,管道配置中包含input、output和filter(可选)插件

    • input和output用来配置输入和输出数据源、filter用来对数据进行过滤或预处理
    • 在这里插入图片描述
  • Logstash 配置文件结构

    • Logstash的管道配置文件对每种类型的插件都提供了一个单独的配置部分,用于处理管道事件
    • 每个配置部分可以包含一个或多个插件
      • 指定多个filter插件,Logstash会按照它们在配置文件中出现的顺序进行处理
  • bin/logstash ‐f logstash‐demo.conf 运行

input {
  stdin { } 
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] 
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"]} 
  stdout { codec => rubydebug }
}
  • Logstash Queue

    • 在这里插入图片描述

      • In Memory Queue: 进程Crash,机器宕机,都会引起数据的丢失
      • Persistent Queue: 机器宕机,数据也不会丢失; 数据保证会被消费; 可以替代 Kafka等消息队列缓冲区的作用
    • queue.type: persisted 默认是 memory

    • queue.max_bytes: 4gb

  • Codec Plugin - Multiline

    • pattern: 设置行匹配的正则表达式
    • what : 如果匹配成功,那么匹配行属于上一个事件还是下一个事件
      • previous / next
    • negate : 是否对pattern结果取反
      • true / false
input {
  stdin {
    codec => multiline {
      pattern => "^\s"
      what => "previous"
    }
  }
}

filter { }

output {
  stdout { codec => rubydebug } 
}
  • Input Plugin - File
    • 支持从文件中读取数据,如日志文件
    • 文件读取需要解决的问题:只被读取一次。重启后需要从上次读取的位置继续 (通过 sincedb 实现)
    • 读取到文件新内容,发现新文件
    • 文件发生归档操作 (文档位置发生变化,日志 rotation),不能影响当前的内容读取
  • Filter Plugin:Filter Plugin可以对Logstash Event进行各种处理,例如解析,删除字段,类型转换
    • Date: 日期解析
    • Dissect: 分割符解析
    • Grok: 正则匹配解析
    • Mutate: 处理字段。重命名,删除,替换
    • Ruby: 利用Ruby 代码来动态修改Event
  • Filter Plugin - Mutate
    • Convert : 类型转换
    • Gsub : 字符串替换
    • Split / Join /Merge: 字符串切割,数组合并字符串,数组合并数组
    • Rename: 字段重命名
    • Update / Replace: 字段内容更新替换
    • Remove_field: 字段删除
  • Logstash 导入数据到 ES
input { 
  file { 
    path => "/home/es/logstash‐7.17.3/dataset/movies.csv"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

filter {
  csv {
    separator => ","
    columns => ["id","content","genre"] 
  }
  mutate {
    split => { "genre" => "|" }
    remove_field => ["path", "host","@timestamp","message"] 
  }
  mutate {
    split => ["content", "("]
    add_field => { "title" => "%{[content][0]}"} 
    add_field => { "year" => "%{[content][1]}"} 
  }
  mutate {
    convert => {
      "year" => "integer"
    }
    strip => ["title"]
    remove_field => ["path", "host","@timestamp","message","content"] 
  }
}

output {
  elasticsearch {
    hosts => "http://localhost:9200" 
    index => "movies"
    document_id => "%{id}"
    user => "elastic"
    password => "123456"
  }
  stdout { }
}
  • 同步数据库数据到 ES: 借助 JDBC Input Plugin 将数据从数据库读到 Logstash
    • 需要自己提供所需的 JDBC Driver
    • JDBC Input Plugin 支持定时任务 Scheduling,其语法来自 Rufus-scheduler
      • 其扩展了 Cron,使用 Cron 的语法可以完成任务的触发
    • JDBC Input Plugin 支持通过 Tracking_column / sql_last_value 的方式记录 State,最终实现增量的更新
    • 需要拷贝 jdbc 依赖到 logstash/drivers 目录下
    • ES 创建 alias,只显示没有被标记 deleted 的用户
      • 需要数据库表中有 deleted 字段
input { 
  jdbc { 
    jdbc_driver_library => "/home/es/logstash‐7.17.3/drivers/mysql‐connector-java‐5.1.49.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/test?useSSL=false"
    jdbc_user => "root"
    jdbc_password => "123456"
    # 启用追踪,如果为true,则需要指定tracking_column
    use_column_value => true
    # 指定追踪的字段,
    tracking_column => "last_updated"
    # 追踪字段的类型,目前只有数字(numeric)和时间类型(timestamp),默认是数字类型 
    tracking_column_type => "numeric"
    # 记录最后一次运行的结果
    record_last_run => true
    # 上面运行结果的保存位置
    last_run_metadata_path => "jdbc‐position.txt"
    statement => "SELECT * FROM user where last_updated >:sql_last_value;" 
    schedule => " * * * * * *"
  }
}

output {
    elasticsearch {
    document_id => "%{id}"
    document_type => "_doc"
    index => "users"
    hosts => ["http://localhost:9200"] 
    user => "elastic"
    password => "123456"
  }
  stdout{
    codec => rubydebug
  }
}
# 创建 alias,只显示没有被标记 deleted 的用户
POST /_aliases
{"actions":[{"add":{
  "index":"users",
  "alias":"view_users",
  "filter":{"term":{"is_deleted":0}}}}]}

FileBeat

  • Beats 轻量型数据采集器是一个免费且开放的平台,集合了多种单一用途的数据采集器
  • FileBeat 专门用于转发和收集日志数据的轻量级采集工具
    • 它可以作为代理安装在服务器上,FileBeat监视指定路径的日志文件,收集日志数据
    • 并将收集到的日志转发到Elasticsearch或者Logstash
  • FileBeat 的工作原理
    • ![[../../assets/Attachment/Pasted image 20240527042649.png | 400]]

    • 启动FileBeat时,会启动一个或者多个输入(Input),这些Input监控指定的日志数据位置

    • FileBeat会针对每一个文件启动一个Harvester(收割机)

    • Harvester读取每一个文件的日志,将新的日志发送到libbeat

    • libbeat将数据收集到一起,并将数据发送给输出(Output)

  • logstash vs FileBeat
    • Logstash是在jvm上运行的,资源消耗比较大。而FileBeat是基于golang编写的,功能较少但资源消耗也比较小,更轻量级
    • Logstash 和Filebeat都具有日志收集功能,Filebeat更轻量,占用资源更少
    • Logstash 具有Filter功能,能过滤分析日志
    • 一般结构都是Filebeat采集日志,然后发送到消息队列、Redis、MQ中,然后Logstash去获取,利用Filter功能过滤分析,然后存储到Elasticsearch中
    • FileBeat和Logstash配合,实现背压机制
      • 当将数据发送到Logstash或 Elasticsearch时,Filebeat使用背压敏感协议,以应对更多的数据量
      • 如果Logstash正在忙于处理数据,则会告诉Filebeat 减慢读取速度
      • 一旦拥堵得到解决,Filebeat就会恢复到原来的步伐并继续传输数据
  • filebeat.yml
 output.elasticsearch:
   hosts: ["192.168.65.174:9200","192.168.65.192:9200","192.168.65.204:9200"]
   username: "elastic"
   password: "123456"
   setup.kibana:
     host: "192.168.65.174:5601"
  • 启用和配置数据收集模块
# 查看可以模块列表
./filebeat modules list
# 启用 nginx 模块
./filebeat modules enable nginx
# 启用 Logstash 模块
./filebeat modules enable logstash
# setup 命令加载 Kibana 仪表板。 如果仪表板已经设置,则忽略此命令。 
./filebeat setup
# 启动 Filebeat
./filebeat ‐e
# 如果需要更改 nginx 日志路径,修改 modules.d/nginx.yml 
‐ module: nginx
    access:
    var.paths: ["/var/log/nginx/access.log*"]
# 在 modules.d/logstash.yml 文件中修改设置
‐ module: logstash
    log:
    enabled: true
    var.paths: ["/home/es/logstash‐7.17.3/logs/*.log"]

ELK

  • 集中化日志管理思路:日志收集 -> 格式化分析 -> 检索和可视化 -> 风险告警
  • ELK架构分为两种,一种是经典的ELK,另外一种是加上消息队列(Redis或Kafka或RabbitMQ)和Nginx结构
    • 经典的ELK主要是由Filebeat + Logstash + Elasticsearch + Kibana组成

      • 适用于数据量小的开发环境,存在数据丢失的危险
      • 在这里插入图片描述
    • 整合消息队列+Nginx架构:主要加上了Redis或Kafka或RabbitMQ做消息队列,保证了消息的不丢失

      • 主要用在生产环境,可以处理大数据量,并且不会丢失数据
      • 在这里插入图片描述

采集 Tomcat 服务器日志

  • 使用FileBeats将日志发送到Logstash
    • 因为Tomcat的web log日志都是以IP地址开头的,所以我们需要把不以ip地址开头的行追加到上一行
    • multiline 多行日志
      • pattern:正则表达式
      • negate:true 或 false
        • 默认是false,匹配pattern的行合并到上一行
        • true,不匹配pattern的行合并到上一行
      • match:after 或 before,合并到上一行的末尾或开头
vim filebeat‐logstash.yml
chmod 644 filebeat‐logstash.yml
./filebeat ‐e ‐c filebeat‐logstash.yml
filebeat.inputs:
  ‐ type: log
    enabled: true
    paths:
      ‐ /home/es/apache‐tomcat‐8.5.33/logs/*access*.*
        multiline.pattern: '^\\d+\\.\\d+\\.\\d+\\.\\d+ '
        multiline.negate: true
        multiline.match: after
        output.logstash:
        enabled: true
        hosts: ["192.168.65.204:5044"]
  • Logstash输出数据到Elasticsearch
    • filebeat‐elasticSearch.conf
    • bin/logstash ‐f config/filebeat‐elasticSearch.conf ‐‐config.reload.automatic
  • ES中会生成一个以logstash开头的索引
input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"] 
    user => "elastic"
    password => "123456"
  }
  stdout{
    codec => rubydebug
  }
}
  • 利用Logstash过滤器解析日志
    • bin/logstash‐plugin list
  • Grok插件:Grok是一种将非结构化日志解析为结构化的插件
    • 适合用来解析系统日志、Web服务器日志、MySQL或者是任意其他的日志格式
    • Grok是通过模式匹配的方式来识别日志中的数据,可以把Grok插件简单理解为升级版本的正则表达式
    • 它拥有更多的模式,默认Logstash拥有120个模式。如果这些模式不满足我们解析日志的需求,我们可以直接使用正则表达式来进行匹配
    • 可以使用Kibana来进行Grok开发
  • Grok语法 %{SYNTAX:SEMANTIC}
    • SYNTAX(语法)指的是Grok模式名称
    • SEMANTIC(语义)是给模式匹配到的文本字段名
    • %{NUMBER:duration} %{IP:client}
      • duration表示:匹配一个数字,client表示匹配一个IP地址
    • 默认在Grok中,所有匹配到的的数据类型都是字符串
      • 转换成int类型(目前只支持int和float): %{NUMBER:duration:int} %{IP:client}
filter {
  grok {
# 192.168.65.103 ‐ ‐ [23/Jun/2022:22:37:23 +0800] "GET /docs/images/docs‐stylesheet.css HTTP/1.1" 200 5780
    match => { "message" => "%{IP:ip} ‐ ‐ \[%{HTTPDATE:date}\] \"%{WORD:method} %{PATH:uri} %{DATA:protocol}\" %{INT:status} %{INT:length}" }
  }
}
  • 使用mutate插件过滤掉不需要的字段
mutate {
  enable_metric => "false"
  remove_field => ["message", "log", "tags", "input", "agent", "host", "ecs", "@version"]
}
  • 要将日期格式进行转换,可以使用Date插件来实现
filter {
  date {
    match => ["date","dd/MMM/yyyy:HH:mm:ss Z","yyyy‐MM‐dd HH:mm:ss"]
    target => "date"
  }
}
  • 输出到Elasticsearch指定索引
    • index来指定索引名称,默认输出的index名称为:logstash-%{+yyyy.MM.dd}
    • 要在index中使用时间格式化,filter的输出必须包含 @timestamp 字段,否则将无法解析日期
  • 注意:index名称中,不能出现大写字符
output {
  elasticsearch {
    index => "tomcat_web_log_%{+YYYY‐MM}" 
    hosts => ["http://localhost:9200"]
    user => "elastic"
    password => "123456"
  }
  stdout{
    codec => rubydebug 
  }
}
  • 完整的Logstash配置文件
    • bin/logstash ‐f config/filebeat‐filter‐es.conf ‐‐config.reload.automatic
input {
  beats {
    port => 5044 
  }
}

filter {
  grok {
    match => {
      "message" => "%{IP:ip} ‐ ‐ \[%{HTTPDATE:date}\] \"%{WORD:method} %{PATH:uri} %{DATA:protocol}\" %{INT:status:int} %{INT:length:int}"
    }
  }
  mutate {
    enable_metric => "false"
    remove_field => ["message", "log", "tags", "input", "agent", "host", "ecs", "@version"]
  }
  date {
    match => ["date","dd/MMM/yyyy:HH:mm:ss Z","yyyy‐MM‐dd HH:mm:ss"]
    target => "date"
  }
}

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    index => "tomcat_web_log_%{+YYYY‐MM}" 
    hosts => ["http://localhost:9200"]
    user => "elastic"
    password => "123456"
  } 
}

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

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

相关文章

JVM4-运行时数据区

目录 概述 程序计数器 栈 Java虚拟机栈 概述 栈帧的组成 局部变量表 操作数栈 帧数据 栈内存溢出 本地方法栈 堆 方法区 类的元信息 运行时常量池 方法区的实现 方法区的溢出 字符串常量池 直接内存 概述 Java虚拟机在运行Java程序过程中管理的内存区域&am…

一款好看的导航网HTML源码((全静态页面带特效)

源码介绍 一款好看的导航网HTML源码(全静态页面带特效),页面自适应,单页源码没有后台,需要的下载。 效果预览 源码获取 一款好看的导航网HTML源码

JENV版本管理工具

下载地址&#xff1a;https://github.com/jenv/jenv 安装步骤 将其添加到PATH中 使用方法&#xff08;注意&#xff1a;局部配置会覆盖全局配置。使用命令可覆盖局部&#xff09; 添加新的Java环境&#xff08;需提供绝对路径&#xff09; jenv add <名称> <路径>…

AIoTedge IoT平台替代网关、PLC和HMI,实现智慧农业大棚控制

AIoTedge作为一个集成了边缘物联网平台、软网关和边缘AI平台的创新产品&#xff0c;它通过边缘计算技术实现了数据的即时处理和智能分析&#xff0c;有效降低了延迟和带宽消耗。在智慧农业大棚的智能控制中&#xff0c;AIoTedge可以替代传统的网关、PLC和HMI&#xff08;人机界…

嵌入式全栈开发学习笔记---C++(运算符重载)

目录 运算符重载概念 运算符重载语法 运算符重载的两种方法 运算符重载的步骤 运算符重载限制 运算符重载原则 重载输出运算符 如何判断返回引用还是普通变量&#xff1f; 赋值运算符重载 重载自增运算符 重载数组下标运算符[ ] 重载函数调用运算符( ) 不要重载逻…

聚乙二醇-降冰片烯!有啥用?打印各种3D结构支持细胞培养!

大家好&#xff0c;今天我们来了解一项关于3D生物打印的研究——《Poly(ethylene glycol)-Norbornene as a Photo-Click Bioink for Digital Light Processing 3D Bioprinting》发表于《ACS Applied Materials & Interfaces》。3D生物打印在组织工程和再生医学领域具有重要…

【RAG】LongRAG:利用长上下文LLMs增强检索增强生成

前言 现有的RAG框架通常使用100词的短段落作为检索单元&#xff0c;这种设计使得检索器需要在大量语料库中搜索&#xff0c;增加了工作负担&#xff0c;并且容易引入难负样本&#xff0c;影响性能。LongRAG框架为了解决这一问题&#xff0c;该框架使用长检索单元&#xff08;最…

伴奏提取免费软件怎么选?这5款工具让编辑更简单

音频提取&#xff0c;听起来可能有点技术范&#xff0c;但其实它就在我们生活的各种小细节里。 比如在网上看到一个超有感觉的视频&#xff0c;背景音乐简直完美&#xff0c;但你只想保存这段音乐&#xff1b;又或者你是个播客&#xff0c;需要从一段采访中提取清晰的对话声轨…

全国百佳出版社专著转让

1、信息化XXX高校英语教学模式研究 2、高校计算机教学XXXXXX革创新研究 3、文创产品设计XXXXXX 4、多元化语文教学&#xff1a;XXX策略

拆解kolors古诗文绘本comfyui工作流,学习提示词多样性组合!

前言 三人行必有我师&#xff0c;在comfyui工作流的搭建中这句话同样有用&#xff0c;几天内我们就学习如何借助kolors这个更具中国元素的模型生古诗文绘本工作流&#xff01; 老规矩先说原理&#xff0c;借助CR prompt list节点 1.搭建kolors文生图工作流 不会搭建kolors文生…

21.新增管理员页面制作

新增管理员页面制作 1.修改AdminUser.vue <template><el-main><!-- 搜索栏 --><el-form :model"searchParm" :inline"true" size"default"><el-form-item><el-input v-model"searchParm.nickName"…

9. GIS技术支持工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

STM32(九):定时器——TIM编码器接口

Encoder Interface 编码器接口 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度。 每个高级定时器和通用定时器都拥有1个…

深度学习(七)-计算机视觉基础

计算机视觉 计算机视觉在广义上是和图像相关的技术总称。包括图像的采集获取&#xff0c;图 像的压缩编码&#xff0c;图像的存储和传输&#xff0c;图像的合成&#xff0c;三维图像重建&#xff0c;图像增强&#xff0c;图像修复&#xff0c;图像的分类和识别&#xff0c;目…

探索中国星坤:构建全球合作网络,服务全球客户!

在全球化的浪潮中&#xff0c;中国星坤以其卓越的产品和服务&#xff0c;成为全球通信、计算机、医疗电子等多个行业的领军企业。通过构建广泛的全球代理商合作伙伴网络&#xff0c;星坤不仅提升了自身的品牌影响力&#xff0c;更确保了其产品和服务的全球覆盖。本文将探讨星坤…

windows 如何使用免安装版 node?

由于工作需要&#xff0c;本机无法自主安装软件&#xff0c;于是产生了这样一个需求。苦寻全网良久才实现&#xff0c;所以必须把这个过程记录下来&#xff0c;以防后期再次遇到同样的问题。 &#xff08;1&#xff09;首先免安装版 node 下载 node 下载地址 根据自己的需要…

calibre:如何find object

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章:

最新热门火爆小程序项目 在线敲木鱼小程序源码系统 功能强大 带完整的安装代码包以及搭建教程

系统概述 本系统采用微信小程序框架开发&#xff0c;充分利用了微信平台庞大的用户基础及丰富的生态资源。技术架构上&#xff0c;主要包括前端界面设计、后端逻辑处理、数据库管理以及云服务等部分。前端采用微信小程序提供的WXML、WXSS等语言进行页面布局与样式设计&#xf…

大白话说什么是“MLLM”多模态大语言模型

1. 什么是MLLM多模态大语言模型 1.1 先来思考一个问题 如果上传了一张图片&#xff0c;并向大模型提问。“图片中绿色框框中的人是谁&#xff1f;” 大模型回答&#xff1a;“那是波多野吉衣老师” 请问&#xff0c;大模型是怎么做到的&#xff1f; 我们用常规的思路来想一…

构建全景式智慧文旅生态:EasyCVR视频汇聚平台与AR/VR技术的深度融合实践

在科技日新月异的今天&#xff0c;AR&#xff08;增强现实&#xff09;和VR&#xff08;虚拟现实&#xff09;技术正以前所未有的速度改变着我们的生活方式和工作模式。而EasyCVR视频汇聚平台&#xff0c;作为一款基于云-边-端一体化架构的视频融合AI智能分析平台&#xff0c;可…