zoukankan      html  css  js  c++  java
  • ELK提高篇之Logstash

    二、Logstash

    2.1、安装logstash

    logstash依赖java 8或 java 11,也可以使用OpenJDK,在进行安装时,我们需要声明JAVA_HOME的环境变量,以保证正常地安装。这里我们采用OpenJDK的方式,更为简洁。

    [root@elk ~]# java -version
    openjdk version "1.8.0_222"
    OpenJDK Runtime Environment (build 1.8.0_222-b10)
    OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
    

    YUM安装方式:

    # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    
    #增加logstash源到yum仓库/etc/yum.repos.d/
    [logstash-6.x]
    name=Elastic repository for 6.x packages
    baseurl=https://artifacts.elastic.co/packages/6.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
    
    # yum install logstash
    

    Logstash的工作原理图:

    1567733408929

    标准的输入输出测试:

    /usr/share/logstash/bin/logstash -e 'input {stdin {} } output { stdout {} }'
    hello
    

    2.2、Logstash的工作原理解析

    Logstash进行数据采集和流水线处理主要有三个步骤:inputs --> filters --> outputs

    inputs负责定义数据采集的来源,filters进行自定义的过滤日志的规则,outputs是将日志输出到日志的存储区域,如elasticsearch存储。

    inputs和outputs都支持对数据的格式进行编码和解码操作。

    • Inputs

      inputs支持多种数据采集的方式,常用的方式有以下几种:

      file:直接读取日志文件,类似命令行执行tailf查看日志

      syslog:通过514端口进行监听syslog日志信息

      redis:从redis服务器集群中读取日志,redis通常会作为一个中间运输层,以降低logstash日志处理的压力

      beats:是一种轻量级的日志收集方式

    • Filters

      Filters是logstash日志收集中的过滤处理层,常用的过滤器包含以下几种:

      grok:解析和构建任意文本,通俗地说就是将非结构化的日志进行定义成结构化的格式

      mutate:对日志的字段进行修改,替换和删除

      drop:对日志进行删减部分

      clone:对日志进行复制,可以是增加或者是删除操作

      geoip:添加ip的地理位置信息,用于在kibana的图表统计信息,可以看到访问的区域分布

    • Outputs

      Outputs是Logstash收集的最后一个环节,通常将前面收集的日志进行过滤规则以后再统一输出到存储区域。通常存储区包含以下几种:

      elasticsearch:将收集到的数据发送到elasticsearch,其可以提供高效方便的格式化查询

      file:将日志数据存储在文件当中

      graphite:将日志存储到开源的时序数据库graphite当中,存储和聚合监控数据并绘制图表

      statsd:这是一个监听服务,类似redis的使用,属于一个中间缓冲层,结合graphite一起使用

    • Codecs

      Codecs是在输入和输出层的一个文本格式的编码器,支持json,msgpack和各种文本格式,如txt

      json:对数据进行编码和解码成json格式

      multiline:将多行的文本进行合并成单行的文本格式进行输出

    2.3、Logstash的配置和运行

    2.3.1、Logstash的目录结构

    在通过RPM包安装Logstash后,我们可以看到有很多目录,通常了解一个软件的使用,对目录的使用了解也是非常有必要的,可以加深对Logstash设计的理解,其结构如下:

    类型 描述 默认值 如何定义配置
    home logstash安装的默认主目录 /usr/share/logstash
    bin logstash的二进制脚本程序和logstash-plugin插件安装脚本 /usr/share/logstash/bin
    settings 配置文件,包括logstash.yml、jvm选项配置、启动选项配置 /etc/logstash path.settings
    conf logstash数据收集配置 /etc/logstash/conf.d/*.conf /etc/logstash/pipelines.yml
    logs 日志文件 /var/log/logstash path.logs
    plugins 插件目录 /usr/share/logstash/plugins path.plugins
    data 数据持久化目录 /var/lib/logstash path.data

    2.3.2、Logstash的配置文件

    Logstash主要有两种配置文件,分别是:logstash.yml和pipeline.yml,logstash.yml用于配置logstash的启动和执行相关配置,pipeline.yml用于配置流水线数据处理的配置。其中在安装完成后,还包含以下的配置文件:

    logstash.yml:定义logstash的基础配置信息

    pipeline.yml:定义数据收集规则的配置信息

    jvm.options:定义JVM的总堆空间的最小值和最大值,也就是内存使用量,默认是1g

    log4j2.properties:log4j2库的相关设置

    startup.options:定义logstash启动时的相关配置

    logstash.yml的详解:

    配置参数 解析 默认值
    node.name 节点名称定义 主机名
    path.data 持久化数据目录定义 LOGSTASH_HOME/data
    pipeline.id pipeline的id号 main
    pipeline.java_execution 使用java执行引擎 false
    pipeline.workers 定义在过滤筛选和输出阶段的进程数量 默认为cpu的核心数
    pipeline.batch.size 定义在筛选和输出之前单次处理数据量大小,通常和jvm的堆内存值相关,值越大,jvm内存配置也需要更大 125
    pipeline.batch.delay 批处理数据的时间延迟,在数据量不达标时的延迟时间,单位为毫秒 50
    pipeline.unsafe_shutdown 在关机状态强制关闭logstash在处理的数据,会导致数据丢失 false
    path.config pipeline的相关配置,通常在pipeline.yml中配置好
    http.host 监听配置 "127.0.0.1"
    http.port 监听端口 9600
    path.logs 日志路径 LOGSTASH_HOME/logs
    log.format 日志格式 文本
    path.plugins 插件定义

    2.4、Logstash实用举例

    Logstash配置文件构建语法:

    input {
      ...
    }
    
    filter {
      ...
    }
    
    output {
      ...
    }
    

    2.5、Logstash常用插件

    2.5.1、input插件

    Logstash 使用一个名叫 FileWatch的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb的数据库文件来跟踪被监听的日志文件的当前读取位置。sincedb 文件中记录了每个被监听的文件的 inode, major number, minor number 和 pos。配置示例如下:

    input {
        file {
            path => "/var/log/messages"
            type => "system"
            start_position => "beginning"
        }
    }
    
    output {
        stdout {
            codec => rubydebug
        }
    }
    

    tcp模块的使用场景如下: 有一台服务器A只需要收集一个日志,那么我们就可以不需要在这服务器上安装logstash,我们通过在其他logstash上启用tcp模块,监听某个端口,然后我们在这个服务器A把日志通过nc发送到logstash上即可。

    input {
        tcp {
            port => "5566"
            mode => "server"
            type => "tcplog"
        }
    }
    
    output {
        stdout {
            codec => rubydebug
        }
    }
    

    syslog支持RFC3164的系统日志格式,在logstash端进行tcp或upd的监听,从而实现对系统日志的收集。配置该日志收集,本机的syslog会默认发送到logstash,同时也要在rsyslog进行配置发送的监听地址。

    # vim /etc/rsyslog.conf		#修改rsyslog发送日志的监听端口
    *.* @@192.168.56.100:44231
    
    #配置logstash收集rsyslog发送的日志并标准输出
    input {
        syslog {
            port => "44231" 
        }
    }
    
    output {
        stdout {
            codec => rubydebug
        }
    }
    

    具体实现中,UDP 监听器只用了一个线程,而 TCP 监听器会在接收每个连接的时候都启动新的线程来处理后续步骤。所以在监听时,建议配置TCP的监听的性能会更佳。

    2.5.2、filter插件

    • date
    • grok
    • dissect
    • geoip
    • json
    • kv
    • metrics
    • mutate
    • ruby
    • split
    • elapsed

    curl '192.168.56.100:9200/_cat/indices?v'

    2.5.3、output插件

  • 相关阅读:
    java中Date的getTime() 方法奇葩问题
    ant的那些闹挺事
    webDriver中的alert
    WebDriver 随笔
    java.lang.UnsupportedClassVersionError
    android 测试(转)
    python 与linux交互
    python与mysql交互
    JMeter 响应数据为空
    python 异常
  • 原文地址:https://www.cnblogs.com/linuxk/p/11703985.html
Copyright © 2011-2022 走看看