Logstash - 只读取文件中的附加数据
Logstash - reading only appended data in file
我正在学习如何使用 logstash,但在使用不断更新的 logstash 读取文件时遇到了一些问题。这是我的测试:
- logstash.conf
input {
file {
path => ["/usr/share/logs_data/first_log_test.log"]
start_position => "beginning"
}
}
filter {
grok {
match => ["message", "(?<execution_date>\d{4}-\d{2}-\d{2}) (?<execution_time>\d{2}:\d{2}:\d{2})%{GREEDYDATA}ParaBrutos/configs/pipelines/(?<crawler_category>([^/])+)/(?<crawler_subcategory>([^-])+)-(?<crawler_name>([^.])+).json"]
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "changeme"
ecs_compatibility => disabled
index => "logs_second"
}
}
首先,我使用 this repo 的代码,以 dockerized 的方式安装 ELK stack。
我从这个空的测试日志文件开始,然后在文本编辑器中添加了几行匹配模式的行,同时在 kibana 更新中看到索引模式。但是,我在此测试日志中添加的每个新行都不是单独添加的,并且我在 kibana 索引模式中看到了旧条目的命中。
会发生什么?
会不会是和创建索引模式时没有选择时间过滤器有关?
或与 since_db
设置相关的内容?但是什么?因为默认情况下,不是应该保存文件的最后读取位置吗?
或与start_position
相关的内容?即使,通过插件documentation,它应该只有在第一次读取文件完成后才生效?
我有点迷茫,尝试了很多东西,但仍然不太了解发生了什么。你能帮帮我吗?
如果您使用的是文本编辑器,那么每次退出时可能都会创建一个新文件。
这可能是 inode 重用问题。 META issue 211 中有各种问题的链接。特别是看到251.
在这些文件可以轮换时跟踪哪些文件已被读取是一个非常困难的问题。比大多数人最初想象的要难得多。一个正确的选择是对文件内容进行校验和(尽管这不是万无一失的)。文件输入不会那样做,因为它会变得非常昂贵。相反,它实现了一种非常便宜的技术,几乎总能正确执行(但在少数情况下,它决定它已经读取了一个它尚未读取的文件)。
在其他情况下,它会通过复制数据(这就是您正在点击的内容)而出错。正如我所说,这是一个非常困难的问题。
我正在学习如何使用 logstash,但在使用不断更新的 logstash 读取文件时遇到了一些问题。这是我的测试:
- logstash.conf
input {
file {
path => ["/usr/share/logs_data/first_log_test.log"]
start_position => "beginning"
}
}
filter {
grok {
match => ["message", "(?<execution_date>\d{4}-\d{2}-\d{2}) (?<execution_time>\d{2}:\d{2}:\d{2})%{GREEDYDATA}ParaBrutos/configs/pipelines/(?<crawler_category>([^/])+)/(?<crawler_subcategory>([^-])+)-(?<crawler_name>([^.])+).json"]
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "changeme"
ecs_compatibility => disabled
index => "logs_second"
}
}
首先,我使用 this repo 的代码,以 dockerized 的方式安装 ELK stack。
我从这个空的测试日志文件开始,然后在文本编辑器中添加了几行匹配模式的行,同时在 kibana 更新中看到索引模式。但是,我在此测试日志中添加的每个新行都不是单独添加的,并且我在 kibana 索引模式中看到了旧条目的命中。
会发生什么?
会不会是和创建索引模式时没有选择时间过滤器有关?
或与
since_db
设置相关的内容?但是什么?因为默认情况下,不是应该保存文件的最后读取位置吗?或与
start_position
相关的内容?即使,通过插件documentation,它应该只有在第一次读取文件完成后才生效?
我有点迷茫,尝试了很多东西,但仍然不太了解发生了什么。你能帮帮我吗?
如果您使用的是文本编辑器,那么每次退出时可能都会创建一个新文件。
这可能是 inode 重用问题。 META issue 211 中有各种问题的链接。特别是看到251.
在这些文件可以轮换时跟踪哪些文件已被读取是一个非常困难的问题。比大多数人最初想象的要难得多。一个正确的选择是对文件内容进行校验和(尽管这不是万无一失的)。文件输入不会那样做,因为它会变得非常昂贵。相反,它实现了一种非常便宜的技术,几乎总能正确执行(但在少数情况下,它决定它已经读取了一个它尚未读取的文件)。
在其他情况下,它会通过复制数据(这就是您正在点击的内容)而出错。正如我所说,这是一个非常困难的问题。