Logstash - 简要使用

AI 摘要: 本文主要介绍Docker的运行以及Logstash工具的使用

1. Docker 运行

1
2
3
4
5
6
// 安装
$ docker pull logstash:7.5.2
7.5.2: Pulling from library/logstash

// 运行()
$ docker run --rm -u root --privileged --name tmp-logstash -dit logstash:7.5.2

2. 基本概念

Logstash 管道具有两个必需元素(输入和输出)和一个可选元素(过滤器)。输入插件使用源中的数据,过滤器插件根据的指定修改数据,输出插件将数据写入目标。

1
2
cd logstash-7.5.2
bin/logstash -e 'input { stdin { } } output { stdout {} }'

3. Filebeat 作为输入源

Logstash pipeline: 它通常具有一个或多个输入,过滤器和输出插件

在创建 Logstash 管道之前,需要配置 Filebeat 以将日志行发送到 Logstash。 Filebeat 客户端是一种轻量级,资源友好的工具,可从服务器上的文件收集日志并将这些日志转发到 Logstash 实例进行处理。 Filebeat 专为可靠性和低延迟而设计。 Filebeat 在主机上的资源占用很少,Beats 输入插件使 Logstash 实例上的资源需求最小化。

3.1. filebeat.yml

安装Filebeat之后,需要对其进行配置。打开位于 Filebeat 安装目录中的 filebeat.yml 文件,并将内容替换为以下几行。确保路径指向先前下载的示例 Apache 日志文件 logstash-tutorial.log:

Filebeat 将尝试在端口5044上进行连接,filebeat.yml 配置:

1
2
3
4
5
6
filebeat.inputs:
- type: log
  paths:
    - /path/to/file/logstash-tutorial.log
output.logstash:
  hosts: ["localhost:5044"]

At the data source machine, run Filebeat with the following command:

1
sudo ./filebeat -e -c filebeat.yml -d "publish"

3.2. filebeat.yml

filebeat 只能定义一个输出源

4. first-pipeline.conf - Logstash 的管道配置支持 Beats 输入插件

接下来,创建一个使用 Beats 输入插件从 Beats 接收事件的 Logstash 配置管道。first-pipeline.conf配置管道的框架input{} filter{} output{}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    # The # character at the beginning of a line indicates a comment. Use
    # comments to describe your configuration.
    input {
        beats {
            port => "5044"
        }
    }
    # The filter part of this file is commented out to indicate that it is
    # optional.
    # filter {
    #
    # }
    output {
        stdout { codec => rubydebug }
    }

验证配置:

1
2
3
4
5
// --config.test_and_exit选项解析的配置文件并报告任何错误。
bin/logstash -f first-pipeline.conf --config.test_and_exit

// --config.reload.automatic选项启用了自动重新加载配置,因此不必在每次修改配置文件时都停止并重新启动Logstash。
bin/logstash -f first-pipeline.conf --config.reload.automatic

调试结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "@timestamp" => 2017-11-09T01:44:20.071Z,
        "offset" => 325,
      "@version" => "1",
          "beat" => {
            "name" => "My-MacBook-Pro.local",
        "hostname" => "My-MacBook-Pro.local",
         "version" => "6.0.0"
    },
          "host" => "My-MacBook-Pro.local",
    "prospector" => {
        "type" => "log"
    },
    "input" => {
        "type" => "log"
    },
        "source" => "/path/to/file/logstash-tutorial.log",
       "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ]
}
...

4.1. pipelines.yml

当 Logstash 启动时,可能会看到有关 Logstash 的一个或多个警告消息,而忽略了pipelines.yml文件,可以放心地忽略此警告。pipelines.yml文件用于在单个 Logstash 实例中运行多个管道。

5. Grok 作为过滤插件

工作管道从Filebeat中读取日志行,但是日志消息的格式并不理想,想解析日志消息以从日志中创建特定的命名字段。为此,将使用grok过滤器插件,以将非结构化日志数据解析为结构化和可查询的内容。

grok 过滤器插件是 Logstash 默认提供的几个插件之一,由于 grok 过滤器插件会在传入的日志数据中查找模式,因此配置插件需要做出有关如何识别用例感兴趣的模式的决策。

Web 服务器日志示例中的代表行如下所示,该行开头的 IP 地址很容易识别,括号中的时间戳也很容易识别。

要解析数据,可以使用%{COMBINEDAPACHELOG} grok 模式,该模式使用以下模式从 Apache 日志中构造行::

1
2
3
83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png
HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

Apache log using the following schema:

InformationField Name
IP Addressclientip
User IDident
User Authenticationauth
timestamptimestamp
HTTP Verbverb
Request bodyrequest
HTTP Versionhttpversion
HTTP Status Coderesponse
Bytes servedbytes
Referrer URLreferrer
User agentagent

5.1. Grok Debugger 调试 1

Grok 是一种模式匹配语法,可用于解析任意文本并对其进行结构化。 Grok 非常适合解析 syslog,apache 和其他 Web 服务器日志,mysql 日志,以及通常用于人类使用的任何日志格式。

Elastic Stack 预制了 120 多个可重复使用的 grok 模式,有关模式的完整列表,请参见摄取节点 grok 模式和Logstash grok模式

先在 Kibana Grok 调试器(该工具在 Kibana 中自动启用)中构建和调试 grok 模式,然后再在数据处理管道中使用它们:

  1. DevTools > Grok Debugger.
  2. Sample Data 输入要解析的消息,比如55.3.244.1 GET /index.html 15824 0.043
  3. Grok Pattern 输入grok pattern,比如%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
  4. Simulate点击模仿,检测输出的结构化数据

5.2. 自定义 Grok 模式

  1. Sample Data ,比如Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>

  2. Grok Pattern模式,比如%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{MSG:syslog_message}

  3. Custom Pattern模式,比如:

    1
    2
    
    POSTFIX_QUEUEID [0-9A-F]{10,11}
    MSG message-id=<%{GREEDYDATA}>
    
  4. Simulate点击模仿,检测输出的结构化数据。

如果发生错误,可以继续遍历自定义模式,直到输出与期望的事件匹配为止

5.3. first-pipeline.conf - 支持 Grok 模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
input {
    beats {
        port => "5044"
    }
}
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}
output {
    stdout { codec => rubydebug }
}

由于启用了自动重新加载配置,因此无需重启 Logstash 即可获取更改。

若确实需要强制 Filebeat从头读取日志文件,按Ctrl + C关闭 Filebeat,然后删除 Filebeat 注册表文件并重启 Filebeat:

1
2
3
4
5
// 删除Filebeat注册表文件,强制Filebeat从头读取其收集的所有文件
sudo rm data/registry

// 重启
sudo ./filebeat -e -c filebeat.yml -d "publish"

Logstash 应用 grok 模式后,事件将具有以下 JSON 表示形式(事件包括原始消息,但日志消息也细分为特定字段):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
    "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
         "offset" => 325,
           "auth" => "-",
          "ident" => "-",
           "verb" => "GET",
     "prospector" => {
        "type" => "log"
    },
     "input" => {
        "type" => "log"
    },
         "source" => "/path/to/file/logstash-tutorial.log",
        "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
           "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
       "referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
     "@timestamp" => 2017-11-09T02:51:12.416Z,
       "response" => "200",
          "bytes" => "203023",
       "clientip" => "83.149.9.216",
       "@version" => "1",
           "beat" => {
            "name" => "My-MacBook-Pro.local",
        "hostname" => "My-MacBook-Pro.local",
         "version" => "6.0.0"
    },
           "host" => "My-MacBook-Pro.local",
    "httpversion" => "1.1",
      "timestamp" => "04/Jan/2015:05:13:42 +0000"
}

6. 筛选器插件

// todo

除解析日志数据以进行更好的搜索外,筛选器插件还可以从现有数据中获取补充信息。例如,geoip 插件查找 IP 地址,从地址中获取地理位置信息,然后将该位置信息添加到日志中。

7. Logstash

Logstash 输出通过使用通过 TCP 运行的 lumberjack 协议将事件直接发送到 Logstash。 Logstash 允许对生成的事件进行其他处理和路由。