Logstash - 只读取文件中的附加数据

Logstash - reading only appended data in file

我正在学习如何使用 logstash,但在使用不断更新的 logstash 读取文件时遇到了一些问题。这是我的测试:

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 索引模式中看到了旧条目的命中。

会发生什么?

我有点迷茫,尝试了很多东西,但仍然不太了解发生了什么。你能帮帮我吗?

如果您使用的是文本编辑器,那么每次退出时可能都会创建一个新文件。

这可能是 inode 重用问题。 META issue 211 中有各种问题的链接。特别是看到251.

在这些文件可以轮换时跟踪哪些文件已被读取是一个非常困难的问题。比大多数人最初想象的要难得多。一个正确的选择是对文件内容进行校验和(尽管这不是万无一失的)。文件输入不会那样做,因为它会变得非常昂贵。相反,它实现了一种非常便宜的技术,几乎总能正确执行(但在少数情况下,它决定它已经读取了一个它尚未读取的文件)。

在其他情况下,它会通过复制数据(这就是您正在点击的内容)而出错。正如我所说,这是一个非常困难的问题。