运维小强仔

导航

Logstash

Logstash

什么是Logstash?

  Logstash 是一种开源的数据收集引擎,具备实时流水线处理能力,它能够动态整合来自不同来源的数据,并将这些数据规范化处理,然后将其发送到指定的目的地,通过这种方式,可以清理所有数据,使其易于处理,从而满足各种高级分析和可视化的需求。

  可以通过运行最基础的 Logstash 管道测试来确认 Logstash 安装是否正常工作,Logstash 的管道处理流程包含两个必需的元素,即 inputoutput ,还有一个可选的元素 filter

  输入插件负责从数据源获取数据,过滤器插件则根据指定的规则对数据进行处理,而输出插件则负责将处理后的数据写入目标位置。

image

安装Logstash,并测试是否可以正常使用(实验使用的环境是centos7.9,logstash使用的是7.17.26)

  1. 下载logstash,下载链接:Past Releases of Elastic Stack Software | Elastic

    image

    通过复制dowload的链接,用yum工具进行安装logstash
    [root@logstash ~]# yum -y install https://www.elastic.co/downloads/past-releases/logstash-7-17-26

    给logstash命令设置软连接到/usr/local/bin下面,以便以后在任何地方都可以使用logstash
    [root@logstash ~]# ln -svf /usr/share/logstash/bin/logstash /usr/local/bin/

    使用"logstash --help"可以查看logstash的使用方法
  2. 测试logstash是否可以正常使用

    启动一个最简单的 Logstash 调试管道,从终端标准输入读取每一行数据,把它包装成 Logstash 事件,然后以 RubyDebug 格式打印到终端标准输出。
    [root@logstash ~]# logstash -e "input { stdin { type => stdin } } output { stdout { codec => rubydebug } } " Using bundled JDK: /usr/share/logstash/jdk ………… The stdin plugin is now waiting for input: [INFO ] 2026-09-17 09:50:16.654 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]} 11111 { "type" => "stdin", "@version" => "1", "message" => "11111", "@timestamp" => 2026-09-17T01:50:29.650Z, "host" => "logstash" }

     从上结果可以看出,从终端的标准输入输入数据,可以以指定的格式打印到终端上,表示logstash可以正常工作。

基于配置文件的方式启动logstash

案例1:从终端标准输入读取每一行数据,把它包装成 Logstash 事件,然后以 RubyDebug 格式打印到终端标准输出。

  1. 在/etc/logstash/conf.d/下写配置文件
    [root@logstash ~]# cd /etc/logstash/conf.d/
    [root@logstash /etc/logstash/conf.d]# vim 01-stdin-to-stdout.conf
    [root@logstash /etc/logstash/conf.d]# cat 01-stdin-to-stdout.conf 
    # 表示数据从哪里来
    input { 
      # 表示从标准输入来
      stdin { 
         type => stdin 
      } 
    }  
    
    # 表示数据到哪里去
    output { 
      # 表示从标准输出去
      stdout { 
        codec => rubydebug 
        # codec => json
      } 
    }
  2. 基于配置文件启动 Logstash
    -f, --path.config CONFIG_PATH Load the logstash config from a specific file
    [root@logstash /etc/logstash/conf.d]# logstash -f 01-stdin-to-stdout.conf 
    Using bundled JDK: /usr/share/logstash/jdk
    …………
    The stdin plugin is now waiting for input:
    [INFO ] 2026-09-17 10:02:17.759 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
    1111
    {
              "type" => "stdin",
           "message" => "1111",
        "@timestamp" => 2026-09-17T02:02:20.047Z,
              "host" => "logstash",
          "@version" => "1"  
    }

案例2:logstash采集文本日志案例

  1. 在/etc/logstash/conf.d/下写配置文件
    [root@logstash /etc/logstash/conf.d]# cat 02-file-to-stdout.conf 
    input { 
      file { 
         # 首次采集文件时从哪开始读取数据
         start_position => "beginning"
         # 指定文件的路径
         path => ["/tmp/xushiqiang.log","/tmp/yangyaqi.log"]
      } 
    }  
    
    output { 
      stdout {} 
    }
    [root@logstash /etc/logstash/conf.d]#
  2. 在指定的文件路径中,加入测试数据
    [root@logstash /etc/logstash/conf.d]# echo "xushiqiang" >> /tmp/xushiqiang.log
    [root@logstash /etc/logstash/conf.d]# echo "yangyaqi" >> /tmp/yangyaqi.log
  3. 启动 Logstash[root@logstash /etc/logstash/conf.d]# logstash -f /etc/logstash/conf.d/02-file-to-stdout.conf
    Using bundled JDK: /usr/share/logstash/jdk
    …………
    [WARN ] 2026-09-17 10:17:57.101 [[main]<file] plain - Relying on default value of `pipeline.ecs_compatibility`, which may change in a future major release of Logstash. To avoid unexpected changes when upgrading Logstash, please explicitly declare your desired ECS Compatibility mode.
    {
          "@version" => "1",
              "host" => "logstash",
              "path" => "/tmp/xushiqiang.log",
           "message" => "xushiqiang",
        "@timestamp" => 2026-09-17T02:17:57.062Z
    }
    {
          "@version" => "1",
              "host" => "logstash",
              "path" => "/tmp/yangyaqi.log",
           "message" => "yangyaqi",
        "@timestamp" => 2026-09-17T02:17:57.103Z
    }

    终止上面的 Logstash 实例,重新基于这个配置文件启动一个实例,发现采集不到数据,这是因为上次采集到的数据已经保存到了 /usr/share/logstash/data/下了,不会重复采集,如果重新采集,
    就要先删除该目录下面的数据

    [root@logstash /etc/logstash/conf.d]# logstash -f /etc/logstash/conf.d/02-file-to-stdout.conf
    Using bundled JDK: /usr/share/logstash/jdk
    …………
    [INFO ] 2026-09-17 10:29:48.258 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}

  4. 数据的保存位置在 /usr/share/logstash/data/
    [root@logstash /etc/logstash/conf.d]# ll /usr/share/logstash/data/
    total 4
    drwxr-xr-x 2 root root  6 Sep 17 09:22 dead_letter_queue
    drwxr-xr-x 3 root root 20 Sep 17 10:17 plugins
    drwxr-xr-x 2 root root  6 Sep 17 09:22 queue
    -rw-r--r-- 1 root root 36 Sep 17 09:22 uuid

    各个文件的介绍如下:
    ead_letter_queue/:死信队列(Dead Letter Queue, DLQ)目录。
    • 作用:当 Logstash 处理事件时,如果某个事件在 filter 或 output 阶段发生错误,如果启用了 DLQ,Logstash 不会直接丢弃这个事件,而是将它写入这个目录保存起来。

    • 默认状态:Logstash 默认不启用 DLQ,所以这个目录通常是空的。

     plugins/:插件相关数据目录。

    • 作用:存放 Logstash 插件运行时的元数据、缓存、依赖信息等。

     queue/:持久化队列(Persistent Queue)目录。

    • 作用:当 Logstash 启用持久化队列时,输入插件收到但尚未被 output 处理完的事件会先写入磁盘,防止 Logstash 崩溃或重启时丢失数据。

    • 默认状态:Logstash 默认使用内存队列,不启用持久化队列,所以这个目录通常为空。

     uuid:Logstash 实例的唯一标识文件。

    • 作用:保存当前 Logstash 实例的 UUID(通用唯一识别码)。每次启动时,Logstash 会读取这个文件;如果不存在,则生成一个新的 UUID 并写入。

    • 用途:用于在集群或监控中区分不同的 Logstash 实例,不要随意删除,否则重启后会生成新的 UUID,可能导致监控数据断裂。

      因为启动logstash时,会将本次的数据信息保存到该目录下,因此当终止此次的 Logstash 任务后,下次再使用该配置文件启动一个 Logstash 不会重新采集上次采集过的数据,如果想要重新采集数据,需要删除该目录下的文件,然后重新启动 Logstash 实例。

案例3:ELFK架构案例filebeat对接Logstash实战 

案例梳理:  
1、filebeat 采集 nginx 访问日志数据,输出到 logstash
2、logstash 接收 filebeat 输出的数据,然后写入到ES集群中
3、在 kibana 进行数据的展示
本次实验的服务器机器如下:
  ES集群:
    http.port: 9200
    cluster.initial_master_nodes: ["10.0.0.141", "10.0.0.142","10.0.0.143"]
   filebeat:10.0.0.144
logstash:10.0.0.142
kibana:10.0.0.143(端口5601)
  1. 在 logstash 上写配置文件,并启动 logstash 实例

    [root@logstash /etc/logstash/conf.d]# cat 03-beats-to-es.conf
    input {
    beats {
    port => 5044
    }
    }

    output {
    elasticsearch {
    hosts => ["10.0.0.141:9200", "10.0.0.142:9200","10.0.0.143:9200"]
    index => "nginx-access-%{+YYYY.MM.dd}"
    }
    }

    [root@logstash /etc/logstash/conf.d]# logstash -f 03-beats-to-es.conf
    Using bundled JDK: /usr/share/logstash/jdk
    OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
    ……………………
    [INFO ] 2026-09-17 10:59:08.341 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
    [INFO ] 2026-09-17 10:59:08.469 [[main]<beats] Server - Starting server on port: 5044

  2. 在 filebeat 上写配置文件,并启动 filebeat 实例
    [root@filebeat /etc/filebeat/config]# cat 13-filebeat-nginx-to-logstash.yaml 
    filebeat.inputs:
      - type: filestream
        id: nginx-access
        enabled: true
        paths:
          - /var/log/nginx/access.log*
    
    output.logstash:
      hosts: ["10.0.0.142:5044"]
    [root@filebeat /etc/filebeat/config]# filebeat -e -c /etc/filebeat/config/13-filebeat-nginx-to-logstash.yaml 2026-09-17T11:00:46.844+0800    INFO    instance/beat.go:698    Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat] Hostfs Path: [/]
    2026-09-17T11:00:46.844+0800    INFO    instance/beat.go:706    Beat ID: b3012926-27e3-45a9-81b0-34fea1561ff8
    …………
    2026-09-17T11:00:47.859+0800    INFO    [publisher]    pipeline/retry.go:223      done
    2026-09-17T11:00:47.865+0800    INFO    [publisher_pipeline_output]    pipeline/output.go:151    Connection to backoff(async(tcp://10.0.0.142:5044)) established
  3. 进入 kibana 的网页(http://10.0.0.143:5601),建立索引模式,查看数据   

    image

    image

    image

     由上可以发现,数据已经成功从 logstash 写入到了 ES 集群。

 

posted on 2026-09-17 11:10  运维小强仔  阅读(6)  评论(0)    收藏  举报