Logstash是一个数据处理管道,允许您从各种来源收集数据,然后将其转换并发送到目的地。它最常用于将数据发送到Elasticsearch(一种分析和搜索引擎),然后可以使用Kibana进行查看。Elasticsearch、Logstash和Kibana一起构成了ELK 堆栈。
Logstash 使用配置文件来配置传入事件的处理方式。
问题
最近,我想以最简单的方式在本地测试一个Logstash配置文件。
我没有安装或设置ELK堆栈的任何部分,也没有足够的时间将相当复杂的Logstash配置变更推送到远程环境。我没有足够的时间去安装完整的ELK堆栈,也没有足够的时间去让每个组件相互交谈。我想实现的目标很简单。
给出一个JSON格式的传入日志,应用一个Logstash配置并查看输出事件。
设置
为了演示的目的,我将从一个任意的C:\temp目录开始工作。
首先,在C:\temp创建3个空白文件。
- logstash.conf - 将用于声明我们要测试的配置。
- logstash_out.logs - 我们将在这里存储logstash配置的输出。
- logstash_in.logs - 供logstash配置使用的输入日志。
安装
你不需要安装Kibana或Elasticsearch,因为我们要将输出存储在本地文件中。
Logstash是需要安装的。我是用Chocolatey安装的,就像我推荐在Windows上安装其他东西一样。安装包括一个logstash.bat文件,用于运行Logstash,并允许你指定配置。
请注意安装位置! 我的二进制文件被安装在C:\ProgramData\chocolatey\lib\logstash\tools下。
你还需要安装Java,因为这是Logstash用来运行的东西。
输入
日志文件中应该有一个JSON格式的输入日志列表,每行一个。Logstash将把每一行作为一个单独的事件来处理。
让我们在logstash_in.logs文件中添加以下内容
{index:"12345",id:1,message:"hello world"} |
然后在logstash.conf文件中添加以下内容
input { |
- path :我们告诉Logstash,输入来自C:\temp目录下的所有.logs文件。在我们的例子中只有一个。
- codec: 关于.logs的扩展名没有什么特别的。事件是以纯文本形式被消费的--是编解码器向Logstash指明了格式(在我们的例子中是JSON)。
- start_position 我们指定Logstash应该从事件列表的开始处开始处理。
- sincedb_path 我们为sincedb_path指定了NUL。这是因为Logstash存储了一个指针来指示它到哪里去消费事件。放置NUL意味着我们将忽略Logstash的指针,而总是读取整个文件。我曾在一些情况下感到困惑,我在想 "为什么我的输入日志没有被消耗?"这是因为Logstash认为它已经消耗了它们。
插件
这是你可以添加任何你喜欢的自定义逻辑的地方,也是你可能正在尝试的地方。让我们在logstash.conf文件中添加一些琐碎的东西,比如添加一个任意的字段
filter { |
输出
你可以输出到任何你喜欢的基于文本的文件。让我们告诉logstash将事件输出到我们的(已经创建的)logstash_out.logs文件中。
output { |
结果
差不多了。我们的最终配置是
input { |
在导航到包含你的Logstash安装目录后,使用我们的配置运行Logstash,像这样
logstash.bat -f C:\temp\logstash.conf
我们看到output.logs文件被填充了一些行,看起来像是
{"@version":"1","index":"12345","message":"hello world","path":"C:/temp/logstash_input.logs","id":1,"host":"HXXXXXXXXXXX","@timestamp":"2020-08-12T08:53:06.774Z","source":"Medium"} |
请注意,Logstash已经添加了一些默认字段(黑体),但我们也有我们的 "源"。"Medium",这是我们在过滤块中指定的。赢了。
现在你可以用插件来玩弄你喜欢的任何配置。我们在这里做了一个简单的过滤器,但它可以变得更加复杂。