【问题标题】:Logstash Always Keeps One message in PipeLineLogstash 始终在 PipeLine 中保留一条消息
【发布时间】:2016-07-01 10:07:58
【问题描述】:

我正在使用 Logstash 从文件中读取和解析日志,并将它们发送到基于 Rest 的 API。我的托运人工作正常,但我遇到了一种奇怪的行为。

Version:
logstash-2.3.2

问题:

当 Logstash shipper 解析第一个日志条目时,它不会发送它,而是将它保存在管道中。当它解析第二个日志条目时,它会将第一个日志条目发送到 API。因此,一条消息始终保留在管道中,并且不会发送到我的 API。

每当我停止我的 Logstash 托运人进程时,它也会发送最后一条剩余的消息。所以,从某种意义上说,没有消息丢失,但托运人总是落后一条消息。

问题: 为什么 Logstash 无法在收到消息后立即刷新其管道并将消息发送到 API。

【问题讨论】:

  • 它可能来自多行过滤器/编解码器:过滤器/编解码器将保留该消息,以便在需要时将其与下一个合并。

标签: logstash logstash-grok logstash-configuration logstash-forwarder logstash-file


【解决方案1】:

您应该粘贴您的 logstash 配置和日志格式以获得正确答案,但是从您所描述的任何内容来看,您似乎正在使用多行插件。因此,从 logstash 2.2 开始,Codec 中有一个用于多线插件的 auto_flush_interval。基本上,这个“auto_flush_interval”可以设置为秒数,如果多行输入插件在指定的秒数之前不监听任何日志行,那么它会将管道中待处理的输入刷新到您的 API...

例如和更多信息请通过这个:

input {
  file {
    path => "$LogstashFilePathValue"
    type => "DemandwareError"
    tags => "$EnvironmentName"
    start_position => "beginning"
    sincedb_path => "NUL"
    codec => multiline {
        pattern => "\A\[%{TIMESTAMP_ISO8601:demandware_timestamp} GMT\]"
        negate => true
        what => previous
        auto_flush_interval => 10
    }
  }
}

示例来自链接:https://github.com/elastic/logstash/issues/1482 有关 auto_flush_interval 的更多信息,请访问:https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html#plugins-codecs-multiline-auto_flush_interval

【讨论】:

  • 5 年,仍然完全有效,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2022-01-07
相关资源
最近更新 更多