因此,我在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
艾德,所以不要在这里剪切它?
所以知道了这一切:
1条答案
按热度按时间bbmckpt71#
好的,我想通了。我现在在Logstash 6. 5上,我的原始配置如下:
当我重做它摆脱
ignore_older
和调整close_older
和stat_interval
使用string_duration
的事情开始工作再次如预期。我的假设是Logstash 6.3.2将设置为
0
的ignore_older
解释为false
,从而禁用ignore_older
,但在6.4及更高版本中,该值现在被解释为以秒为单位的实际时间值?我没有深入研究源代码,但我所经历的一切都表明这是一个问题。不管怎么说,这个配置现在可以工作了,我在MacOS莫哈韦(10. 14. 1)上运行Logstash 6. 5没有任何问题。