版权声明:本文为博主原创文章,转载请注明出处:https://twocups.cn/index.php/2021/03/08/31/

Logstash 官方网站:https://www.elastic.co/cn/logstash

介绍 Logstash

在上一篇文章中,我们介绍了 Filebeat 的工作原理和部署方法。那在 Filebeat 之前,一般是由谁来进行日志收集呢?其实是 Logstash。Logstash 能够同时从多个来源采集数据、转换数据,自然也能进行日志收集的任务。但是,由于 Logstash 是在 Java 虚拟机中跑的,资源消耗比较大,所以后来作者又用 Golang 写了一个功能较少但是资源消耗也小的轻量级的 Logstash-Forwarder。作者加入了 Elastic 公司后,Logstash-Forwarder 的开发工作被合并到了 Packetbeat 项目组这个同样专门用 Golang 的团队。而合并后的新项目就是我们熟悉的 Filebeat

Logstash 是 Elasicsearch 常用的实时数据采集引擎,可以采集来自不同数据源的数据,并对数据进行处理后输出到多种输出源,是 Elastic Stack 的重要组成部分。

而现在 Elastic Stack 架构逐渐成熟,分工也越来越明确,于是 Logstash 也开始专注数据处理的职责。

接下来,我们说说 Logstash 的工作原理

Logstash 的工作分为三个阶段Input -> Filter -> Output,是一个接收 -> 处理 -> 转发的过程。另外,在 Inputs 和 Outputs 中可以使用 Codecs 对数据格式进行处理。这四个部分均以插件形式存在,用户通过定义 pipeline 配置文件,设置需要使用的 Inputs、Filter、Output、Codec 插件,以实现特定的数据采集,数据处理,数据输出等功能。

  • Input:从数据源获取数据,常见的插件有 file、syslog、redis、beats 等;
  • Filter:处理数据,例如格式转换、数据派生,常见的插件有 grok、 mutate、drop、clone、geoip 等;
  • Output:数据输出,常见的插件有 elastcisearch、file、graphite、statsd 等;
  • Codec:在 Input 和 Output 插件中用于数据转换和编码处理,常见的插件有 json、multiline 等。

部署 Logstash

由于 Logstash 是使用 Java 写的,要跑在 Java 虚拟机里面,所以系统里必须有 Java 环境。我们要先检查一下,保证 jdk 的版本要在1.8及以上,各位直接使用整合包中提供的 jdk 即可。

检查完 jdk 后,我们在老地方解压 Logstash 安装包,之后我们并举个简单的例子。

# 解压 Logstash 安装包
cd /soft
tar -zxvf logstash-6.5.4.tar.gz
mv logstash-6.5.4 logstash
# 举个简单的例子
cd ./logstash
bin/logstash -e 'input { stdin { } } output { stdout {} }'

以上的例子执行的指令是控制台接收数据 -> 不做数据处理 -> 控制台输出数据。以下是控制台的输入和输出情况。

从以上例子,我们可以看出 Logstash 是有三个阶段的。那么,我们的配置也要分三个部分。

# 输入
input {...} # 例如标准输入 stdin {...}
# 过滤,对数据进行分割、截取等处理
filter {...}
# 输出
output {...} # 例如标准输出 stdout {...}

换个复杂点的例子。

# 日志例子
2021-03-08 23:00:00|ERROR|1 数据库异常|参数:id=1001

这里我们换一个配置方式:通过配置文件进行配置 Logstash。我们在 Logstash 根目录下新建配置文件 testConfig.conf,然后添加如下内容。

input { # 输入
    file {
        path => "/xxx/test.log" # 日志地址
        start_position => "beginning" # 从日志开头读取
    }
}
filter { # 过滤
    mutate {
    	split => {"message"=>"|"} # 文本通过“|”符号进行划分
    }
}
output { # 输出
	stdout { codec => rubydebug } # 输出的时候加载调试模块
}

这里提一下,输出的时候用了调试的 codec 模块“rubydebug”。如果我们想要查看调试日志的话,那么需要在启动时加上参数 –verbose –debug,这样就可以看到调试日志输出到终端。

# 启动 Logstash,并将调试日志输出到终端
bin/logstash -f testConfig.conf --verbose --debug

当然了,我们也一般不这么输出,毕竟正常情况下都是输出到 Elasticsearch 中的。那么,我们需要修改一下配置文件。

input { # 输入
    file {
        path => "/xxx/test.log" # 日志地址
        start_position => "beginning" # 从日志开头读取
    }
}
filter { # 过滤
    mutate {
    	split => {"message"=>"|"} # 文本通过“|”符号进行划分
    }
}
output { # 输出
    elasticsearch {
    	hosts => ["192.168.56.101:9200"] # 输出到 Elasticsearch
    }
}

最后,重启 Logstash 生效即可。

# 根据配置文件 testConfig.conf 启动 Logstash
bin/logstash -f testConfig.conf

下篇继续

【Elastic Stack系列】第四章:源码分析(一) Filebeat篇

林皓伟

发表回复

您的电子邮箱地址不会被公开。