35、利用Logstash收集、解析和转换数据

利用Logstash收集、解析和转换数据

1. 简介

在日志分析或事件分析系统中,ELK Stack扮演着重要角色。Logstash作为ELK Stack中极为重要的组件,能够帮助我们收集、解析和转换任何格式和类型的数据,将其转化为通用格式,进而用于构建各种应用场景下的分析系统。

2. Logstash基础配置

Logstash的配置通常由一系列输入、过滤和输出插件组成,其通用配置结构如下:

input {

}
filter {

}
output {

}

输入插件用于生成事件,过滤插件对事件进行修改,输出插件则将处理后的事件发送到其他系统。常见的输入插件有 file stdin lumberjack twitter 等;过滤插件有 grok grep mutate drop date 等;输出插件有 elasticsearch stdout mongodb 等。

3. Logstash插件操作与数据类型

3.1 列出插件

  • 列出所有可用插件: bin/plugin list
  • 列出包含特定名称片段的插件: bin/plugin list <namefragment>
  • 按组列出插件(如输入、输出、过滤): bin/plugin list --group <group name> ,例如 bin/plugin list --group output

3.2 插件属性的数据类型

数据类型 描述 示例
数组(Array) 用于一个属性的多个值的集合 path => ["value1","value2"]
布尔值(Boolean) 取值为 true false periodic_flush => false
编解码器(Codec) 用于输入或输出时对数据进行编码或解码 codec => "json"
哈希(Hash) 键值对的集合 match => { "key1" => "value1" "key2" => "value2"}
字符串(String) 用引号括起来的字符序列 value => "Welcome to ELK"

3.3 注释

在Logstash配置中,注释以 # 开头,例如: #this represents a comment

3.4 字段引用

字段可以通过 [field_name] 引用,嵌套字段使用 [level1][level2] 引用。

3.5 Logstash条件语句

Logstash条件语句用于在特定条件下过滤事件或日志行,其语法与其他编程语言类似,支持 if if else else 语句,且可以嵌套。条件语句使用比较运算符、布尔运算符和一元运算符。

if  <conditional expression1>{
    #some statements here.
}
else if  <conditional expression2>{
    #some statements here.
}
else{
    #some statements here.
}

示例:

filter {
    if [action] == "login" {
        mutate { remove => "password" }
    }
}
output {
    # Send Email on Production Errors
    if [loglevel] == "ERROR" and [deployment] == "production" {
        email{
        }
    }
}

4. 输入插件

4.1 file插件

用于将事件和日志行文件流式传输到Logstash,能自动检测文件旋转,并从上次读取的位置继续读取。

input{
    file{
        path => "/path/to/logfiles"
    }
}

配置选项:
- add_field :添加字段到传入事件,类型为哈希,默认值为 {} ,例如 add_field => { "input_time" => "%{@timestamp}" }
- codec :指定编解码器,默认值为 "plain" ,如 codec => "json" 用于解码JSON类型输入
- delimiter :指定分隔符,默认值为 "\n"
- exclude :排除特定类型的文件,类型为数组,例如 path =>["/app/packtpub/logs/*"] exclude => "*.gz"
- path :必需配置,指定读取日志和事件的路径数组
- sincedb_path :指定 sincedb 文件的写入位置,默认值为 $HOME/.sincedb*
- sincedb_write_interval :指定 sincedb 文件的写入频率,默认值为15秒
- start_position :取值为 "beginning" "end" ,指定从文件的开始或结尾开始读取,默认值为 "end"
- tags :添加标签到传入事件,类型为数组,例如 tags =>["processed"]
- type :为不同类型的输入流指定类型,方便后续过滤和处理,例如:

input {
    file{
        path => ["var/log/syslog/*"]
        type => "syslog"
    }
    file{
        path => ["var/log/apache/*"]
        type => "apache"
    }
}

4.2 stdin插件

用于从标准输入流式传输事件和日志行,常用于配置的初步测试。

stdin {
}

配置选项与 file 插件的 add_field codec tags type 类似。

4.3 twitter插件

用于从Twitter流式API读取事件,需要在Twitter开发者API页面注册应用获取相关信息。

twitter {
    consumer_key => "your consumer key here"
    keywords => "keywords which you want to filter on streams" 
    consumer_secret => "your consumer secret here"
    oauth_token => "your oauth token here"
    oauth_token_secret => "your oauth token secret here"
}

配置选项:
- add_field codec tags type file 插件类似
- consumer_key :必需配置,从Twitter应用注册页面获取
- consumer_secret :从Twitter开发者应用注册获取
- full_tweet :布尔值,默认值为 false ,指定是否记录完整推文对象
- keywords :必需配置,类型为数组,指定要跟踪的关键字
- oauth_token oauth_token_secret :从Twitter开发者API页面获取

4.4 lumberjack插件

用于通过 lumberjack 协议接收事件, lumberjack 或Logstash forwarder是轻量级的日志发送器。

lumberjack {
    port => 
    ssl_certificate => 
    ssl_key => 
}

配置选项:
- add_field codec tags type file 插件类似
- host :指定监听的主机,默认值为 "0.0.0.0"
- port :必需配置,指定监听的端口
- ssl_certificate :必需配置,指定SSL证书的路径
- ssl_key :必需配置,指定SSL密钥的路径
- ssl_key_passphrase :指定SSL密钥的密码

4.5 redis插件

用于从Redis实例读取事件和日志,Redis常用于ELK Stack中作为日志数据的代理。

redis {
}

配置选项:
- add_field codec tags type file 插件类似
- data_type :取值为 "list" "channel" "pattern_channel"
- host :指定Redis服务器的主机名,默认值为 "127.0.0.1"
- key :指定Redis的键
- password :指定连接密码
- port :指定Redis实例运行的端口,默认值为6379

更多Logstash输入插件的详细信息可参考:https://www.elastic.co/guide/en/logstash/current/input-plugins.html

5. 输出插件

5.1 csv插件

用于将数据写入CSV文件,指定CSV文件的字段和路径。

csv {
    fields => ["date","open_price","close_price"]
    path => "/path/to/file.csv"
}

配置选项:
- codec :编码数据,默认值为 "plain"
- csv_options :指定CSV输出的高级选项,例如 csv_options => {"col_sep" => "\t" "row_sep" => "\r\n"}
- fields :必需配置,指定输出CSV文件的字段
- gzip :布尔值,指定是否以gzip压缩格式输出,默认值为 false
- path :必需配置,指定CSV文件的路径

5.2 file插件

用于将事件写入文件系统中的文件。

file {
    path => "path/to/file"
}

配置选项包括 codec gzip max_size path

5.3 email插件

用于在特定事件和故障场景下发送电子邮件。

email {
    to => "abc@example.com"
}

配置选项:
- attachments :附件文件路径数组,默认值为 []
- body :电子邮件的纯文本正文,默认值为 ""
- cc :指定抄送的电子邮件列表
- from :指定发件人电子邮件地址,默认值为 "logstash.alert@nowhere.com"
- to :必需配置,指定收件人电子邮件地址
- htmlbody :指定电子邮件的HTML正文
- replyto :指定回复电子邮件的地址
- subject :指定电子邮件的主题,默认值为 ""

5.4 elasticsearch插件

是ELK Stack中最重要的插件,用于将输出写入Elasticsearch以便后续在Kibana中分析。

elasticsearch {
}

部分重要配置选项如下:
| 选项 | 数据类型 | 是否必需 | 默认值 |
| ---- | ---- | ---- | ---- |
| action | 字符串 | 否 | “index” |
| bind_host | 字符串 | 否 | |
| bind_port | 数字 | 否 | |
| cacert | 有效系统路径 | 否 | |
| cluster | 字符串 | 否 | |
| document_id | 字符串 | 否 | |
| document_type | 字符串 | 否 | |
| host | 数组 | 否 | |
| index | 字符串 | 否 | “logstash-%{+YYYY.MM.dd}” |
| max_retries | 数字 | 否 | 3 |
| node_name | 字符串 | 否 | |
| password | 密码 | 否 | |
| port | 字符串 | 否 | |
| user | 字符串 | 否 | |

5.5 ganglia插件

用于将日志事件中的指标发送到Ganglia的 gmond 服务。

ganglia {
    metric => 
    value => 
}

配置选项:
- metric :指定用于性能监控的指标
- unit :指定指标的单位
- value :指定指标的值

5.6 jira插件

可通过 bin/plugin install logstash-output-jira 命令安装,用于将事件发送到JIRA实例以创建JIRA工单。

jira {
    issuetypeid => 
    password => 
    priority => 
    projectid =>
    summary => 
    username => 
}

配置选项:
| 选项 | 数据类型 | 是否必需 |
| ---- | ---- | ---- |
| assignee | 字符串 | 否 |
| issuetypeid | 字符串 | 是 |
| password | 字符串 | 是 |
| priority | 字符串 | 是 |
| projectid | 字符串 | 是 |
| reporter | 字符串 | 否 |
| summary | 字符串 | 是 |
| username | 字符串 | 是 |

5.7 kafka插件

用于将特定事件写入Kafka的主题。

kafka {
    topic_id => 
}

必需配置为 topic_id ,指定要发送消息的主题。

5.8 lumberjack插件

用于将输出写入Logstash forwarder或 lumberjack

lumberjack {
    hosts => 
    port => 
    ssl_certificate => 
}

配置选项:
- hosts :指定 lumberjack 可以发送消息的地址列表
- port :指定连接 lumberjack 通信的端口
- ssl_certificate :指定用于通信的SSL证书路径

5.9 redis插件

用于将事件发送到Redis实例,配置选项与 redis 输入插件类似。

5.10 rabbitmq插件

用于将日志事件推送到RabbitMQ交换器。

rabbitmq {
    exchange => 
    exchange_type => 
    host => 
} 

5.11 stdout插件

用于将输出事件写入控制台,常用于调试配置。

output {
    stdout {}
}

5.12 mongodb插件

可通过 bin/plugin install logstash-output-mongodb 命令安装,用于将数据写入MongoDB。

mongodb {
    collection => 
    database => 
    uri => 
}

配置选项:
- collection :指定要写入数据的MongoDB集合
- database :指定要使用的MongoDB数据库
- uri :指定连接MongoDB的字符串

更多Logstash输出插件的详细信息可参考:https://www.elastic.co/guide/en/logstash/current/output-plugins.html

以下是Logstash输入和输出插件的使用流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B{选择输入插件}:::decision
    B -->|file| C(配置file插件):::process
    B -->|stdin| D(配置stdin插件):::process
    B -->|twitter| E(配置twitter插件):::process
    B -->|lumberjack| F(配置lumberjack插件):::process
    B -->|redis| G(配置redis插件):::process
    C --> H(数据输入):::process
    D --> H
    E --> H
    F --> H
    G --> H
    H --> I{选择输出插件}:::decision
    I -->|csv| J(配置csv插件):::process
    I -->|file| K(配置file插件):::process
    I -->|email| L(配置email插件):::process
    I -->|elasticsearch| M(配置elasticsearch插件):::process
    I -->|ganglia| N(配置ganglia插件):::process
    I -->|jira| O(配置jira插件):::process
    I -->|kafka| P(配置kafka插件):::process
    I -->|lumberjack| Q(配置lumberjack插件):::process
    I -->|redis| R(配置redis插件):::process
    I -->|rabbitmq| S(配置rabbitmq插件):::process
    I -->|stdout| T(配置stdout插件):::process
    I -->|mongodb| U(配置mongodb插件):::process
    J --> V(数据输出):::process
    K --> V
    L --> V
    M --> V
    N --> V
    O --> V
    P --> V
    Q --> V
    R --> V
    S --> V
    T --> V
    U --> V
    V --> W([结束]):::startend

6. 过滤插件

过滤插件用于对从输入插件读取的事件进行中间处理,然后再通过输出插件输出。它们常用于识别输入事件中的字段,并根据条件处理输入事件的某些部分。

6.1 csv过滤插件

用于解析传入的CSV文件中的数据,并将值分配给字段。其配置选项在之前的示例中已有介绍。

6.2 date过滤插件

在ELK中,为事件分配正确的时间戳非常重要,这样才能在Kibana中基于时间进行过滤分析。date过滤插件用于根据日志或事件中的字段分配适当的时间戳,并为时间戳指定正确的格式。如果未设置date过滤插件,Logstash将在首次看到事件或读取文件时分配时间戳。

date {
}

其配置选项在之前的示例中已有介绍。

6.3 drop过滤插件

用于丢弃符合该过滤条件的所有内容。

filter {
    if [fieldname == "test"] {
        drop {
        }
    }
}

上述过滤将导致所有包含 test 字段名的事件被丢弃,这有助于过滤掉输入事件中的无用信息。
配置选项包括:
- add_field
- add_tag
- remove_field
- remove_tag

6.4 geoip过滤插件

用于添加传入事件中IP地址的地理位置信息,该信息从Maxmind数据库获取。Maxmind是一家专门从IP地址获取有用信息的公司,GeoIP是其用于追踪IP地址位置的IP智能产品。所有Logstash版本都附带了Maxmind的GeoLite城市数据库,也可从http://dev.maxmind.com/geoip/legacy/geolite/获取。

geoip {
    source => 
}

配置选项:
- source :必需配置,字符串类型,用于指定要通过geoip服务映射的IP地址或主机名。事件中包含IP地址或主机名的任何字段都可以提供,如果字段是数组类型,则只取第一个值。

6.5 grok过滤插件

是Logstash中最流行和最强大的插件,它可以解析任何非结构化的日志事件,并将其转换为结构化的字段集,以便进一步处理和分析。它可用于解析任何类型的日志,如Apache日志、MySQL日志、自定义应用程序日志或事件中的任何非结构化文本。
Logstash默认附带了一组grok模式,可直接用于标记某些类型的字段,也支持自定义正则表达式。所有可用的grok模式可在https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns查看。
grok模式的通用格式为: %{SYNTAX:SEMANTIC} ,其中 SYNTAX 是匹配日志中文本的模式名称, SEMANTIC 是要分配给该模式的字段名。
例如,要表示一个事件中传输的字节数: %{NUMBER:bytes_transferred} ,这里 bytes_transferred 将引用日志事件中实际传输的字节数。
对于HTTP日志行 54.3.245.1 GET /index.html 14562 0.056 ,grok模式表示为:

%{IP:client_ip} %{WORD: request_method } %{URIPATHPARAM:uri_path} %{NUMBER:bytes_transferred} %{NUMBER:duration}

基本的grok配置如下:

filter{
    grok{
        match =>  { "message" =>"%{IP:client_ip} %{WORD:request_method} %{URIPATHPARAM:uri_path} %{NUMBER:bytes_transferred} %{NUMBER:duration}"}
    }
}

处理后,事件将添加以下字段和值:
- client_ip : 54.3.245.1
- request_method : GET
- uri_path : /index.html
- bytes_transferred : 14562
- duration : 0.056
如果现有的grok模式列表中没有所需的模式,可以根据正则表达式创建自定义grok模式。可使用http://grokdebug.herokuapp.com和http://grokconstructor.appspot.com/设计和测试grok模式。

6.6 mutate过滤插件

是一个重要的过滤插件,用于重命名、删除、替换和修改传入事件中的字段。还可用于转换字段的数据类型、合并两个字段、将文本从小写转换为大写等。

filter {
    mutate {
    }
}

配置选项:
| 选项 | 数据类型 | 是否必需 | 默认值 |
| ---- | ---- | ---- | ---- |
| add_field | 哈希 | 否 | {} |
| add_tag | 数组 | 否 | [] |
| convert | 哈希 | 否 | |
| join | 哈希 | 否 | |
| lowercase | 数组 | 否 | |
| merge | 哈希 | 否 | |
| remove_field | 数组 | 否 | [] |
| remove_tag | 数组 | 否 | [] |
| rename | 哈希 | 否 | |
| replace | 哈希 | 否 | |
| split | 哈希 | 否 | |
| strip | 数组 | 否 | |
| update | 哈希 | 否 | |
| uppercase | 数组 | 否 | |

6.7 sleep过滤插件

用于让Logstash在指定的时间内进入睡眠模式,还可以根据事件数量指定睡眠间隔的频率。
例如,要让Logstash每处理5个事件就睡眠1秒,可以这样配置:

filter {
    sleep {
        time => "1"   # Sleep 1 second
        every => 5   # Sleep on every 5th event.
    }
}

更多Logstash过滤插件的详细信息可参考:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html

7. 编解码器插件

编解码器插件用于对Logstash的传入或传出事件进行编码或解码,它们在输入和输出插件中充当流过滤器。

7.1 json编解码器插件

如果输入事件或输出事件包含完整的JSON文档,则json编解码器插件很有用。

input{
    stdin{
        codec => json{
        }
    }
}

或简单定义为:

input{
    stdin{
        codec => "json"
    }
}

7.2 line编解码器插件

用于将输入中的每一行作为一个事件读取,或将每个传出事件解码为一行。

input{
    stdin{
        codec => line{
        }
    }
}

或简单定义为:

input{
    stdin{
        codec => "line"
    }
}

7.3 multiline编解码器插件

对于某些需要将多行作为一个事件处理的情况非常有用,例如Java异常或堆栈跟踪。
例如,以下配置可以将完整的堆栈跟踪作为一个事件处理:

input {
    file {
        path => "/var/log/someapp.log"
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601} "
            negate => true
        }
    }
}

以下是Logstash过滤和编解码器插件的使用流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B{选择过滤插件}:::decision
    B -->|csv| C(配置csv过滤插件):::process
    B -->|date| D(配置date过滤插件):::process
    B -->|drop| E(配置drop过滤插件):::process
    B -->|geoip| F(配置geoip过滤插件):::process
    B -->|grok| G(配置grok过滤插件):::process
    B -->|mutate| H(配置mutate过滤插件):::process
    B -->|sleep| I(配置sleep过滤插件):::process
    C --> J(事件过滤处理):::process
    D --> J
    E --> J
    F --> J
    G --> J
    H --> J
    I --> J
    J --> K{选择编解码器插件}:::decision
    K -->|json| L(配置json编解码器插件):::process
    K -->|line| M(配置line编解码器插件):::process
    K -->|multiline| N(配置multiline编解码器插件):::process
    L --> O(事件编码/解码):::process
    M --> O
    N --> O
    O --> P([结束]):::startend

综上所述,Logstash提供了丰富的插件来收集、解析、转换和传输数据,通过合理配置这些插件,可以构建强大的日志分析和事件处理系统。在实际应用中,可根据具体需求选择合适的插件,并进行相应的配置和调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值