Logstash 6.4.1(及更高版本)“logstash-input-file”使用“读取”模式在macOS上无法按预期/所需工作

8xiog9wr  于 2022-12-09  发布在  Logstash
关注(0)|答案(1)|浏览(170)

因此,我在RedHat 7(生产版)和macOS High Sierra(10.13.6)上为Apache日志设置了一个相当普通的Logstash,用于开发。从Logstash版本6.3.2升级到6.4.1后,发生了一些奇怪的事情。我在macOS上使用Homebrew安装和更新Logstash,即使我“核击”已安装的Homebrew项目并重新安装,这些问题仍然存在。

开门见山。

简单地说,在6.4.1中,静态数据输入文件不会像在6.3.2和更早版本中那样在启动时被读取和摄取。对于6.4.1,我需要手动将cat日志行记录到Logstash的目标路径,以便“唤醒”并拾取这些新行,即使我指定了新的read模式。
在一天结束的时候,这个安装程序不需要sincedb安装程序,可以重新启动并从文件头读取到文件尾,我们都很满意...至少在Logstash 6.4.1之前是这样...现在没有人满意了。可以做些什么来强制Logstash无论如何都 * 总是 * 从文件头读取数据?

详细信息和发现。

我使用的Logstash设置只是对Apache日志进行一些过滤以获取输入。请注意,文件路径是稍微调整的隐私,但实际上正是我现在使用的,并已使用了过去一年左右没有问题:

input {

  file {
    path => "/opt/logstash/coolapp/access_log*"
    exclude => "*.gz"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    ignore_older => 0
    close_older => 3600
    stat_interval => 1
    discover_interval => 15
  }

}

我在本地开发中使用它的方法是简单地获取远程Apache服务器日志的副本,并将它们放在/opt/logstash/coolapp/目录中。
然后,当我通过如下命令行启动Logstash时,设置了-f选项,因此读取了coolapp-apache.conf

logstash -f coolapp-apache.conf

Logstash在本地启动,发出所有启动状态消息,直到出现以下最后一条消息:

[2018-09-24T12:40:09,458][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}

对我来说,这表明它完全启动并运行,检查我的数据收集输出会显示(如果它正在工作)数据流涌入...但在使用Logstash 6.4.1时,我没有看到数据流入。

文件输入插件在tail模式下工作。

检查文件输入插件(v4.1.5)最新更新的文档,发现有一个新的mode选项,它有一个read模式和一个tail模式。知道默认模式是tail,我在启动本地Logstash调试安装程序后通过执行以下操作测试了安装程序。首先,我复制了access_log,如下所示:

cp /opt/logstash/coolapp/access_log /opt/logstash/coolapp/access_log_BAK

然后,我使用:>将主access_log文件清零,如下所示:

:> /opt/logstash/coolapp/access_log

最后,我运行cat并将复制的文件数据附加到原始文件中,如下所示:

cat /opt/logstash/coolapp/access_log_BAK > /opt/logstash/coolapp/access_log

当我这样做的时候,你看,数据开始像预期的那样流动了!我猜新的文件输入插件是专注于tailing a file more than读取的吧?无论如何,这是可行的,但显然很烦人。我不是这样开发的。我需要Logstash来读取文件并解析它们。

文件输入插件无法在read模式下工作。

因此,我尝试使用以下设置,根据我在官方Logstash文件输入mode文档中看到的内容读取文件:

input {

  file {
    path => "/opt/logstash/coolapp/access_log"
    mode => "read"
    file_completed_action => "log"
    file_completed_log_path => "/Users/Giacomo1968/Desktop/access_log_foo"
  }

}

当然像access_log_foo这样的东西只是为了概念证明文件名进行测试,但是,当所有的说和做这个read模式完全不能在macOS上工作。我甚至尝试改变path到类似我的桌面的东西,它不工作。整个“清零,然后追加一个文件”技巧,我用解释在“尾巴模式”解释不我猜,因为文件没有被tail艾德,所以不要在这里剪切它?
所以知道了这一切:

要强制Logstash 6.4.1 * 总是 * 从文件开头读取数据,无论它在Logstash 6.3.2及更早版本中曾经做过什么?

bbmckpt7

bbmckpt71#

好的,我想通了。我现在在Logstash 6. 5上,我的原始配置如下:

input {

  file {
    path => "/opt/logstash/coolapp/access_log*"
    exclude => "*.gz"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    ignore_older => 0
    close_older => 3600
    stat_interval => 1
    discover_interval => 15
  }

}

当我重做它摆脱ignore_older和调整close_olderstat_interval使用string_duration的事情开始工作再次如预期。

input {

  file {
    path => "/opt/logstash/coolapp/access_log*"
    exclude => "*.gz"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    close_older => "1 hour"
    stat_interval => "1 second"
    discover_interval => 15
  }

}

我的假设是Logstash 6.3.2将设置为0ignore_older解释为false,从而禁用ignore_older,但在6.4及更高版本中,该值现在被解释为以秒为单位的实际时间值?我没有深入研究源代码,但我所经历的一切都表明这是一个问题。
不管怎么说,这个配置现在可以工作了,我在MacOS莫哈韦(10. 14. 1)上运行Logstash 6. 5没有任何问题。

相关问题