4

设法让logstash(1.3.1)将数据发送到elasticsearch(0.9.5)。

我的 logstash conf 文件设置是

input {
  file {
    path => ["D:/apache-tomcat-7.0.5/logs/*.*"]
   }

}
 output {
  stdout { } 
    elasticsearch_http {
    host => "localhost"
    port => 9200
   }
 }

数据存储在索引logstash-2013.12.xx下的ES中

但是,如果我重新启动 logstash,让我们说第二天 - 相同的数据将重新加载到新索引中。即使我再次重新启动,索引中的文档计数也会加倍。

似乎logstash重新读取数据,ES也在复制文档。

有没有办法不在logstash中重新加载或在ES中不重复或两者兼而有之。

4

1 回答 1

9

我在 Logstash 1.3.3 中也遇到了这个问题。Logstash Jira 上的相关错误报告是LOGSTASH-429 File Input - .sincedb 文件在 Windows 上损坏。Boyd Meier 还创建了一个补丁。

此补丁也已被拉入 Jordan Sissel 的 ruby​​-filewatch git 存储库以包含在更高版本中,但它还没有进入。

问题来自使用文件 inode 的 Logstash,该文件在 Windows 上总是返回 0。Boyd Meier 使用文件 ID 获取文件的标识符以绕过问题。在从卷中删除文件之前,此文件 ID 保持不变。

如果您愿意进行一些修补,您可以从 Jordan Sissel 的 ruby​​-filewatch git 存储库中修补更改。对于我刚刚修补并且正在针对测试日志文件进行测试的 1.3.3,步骤如下:

  1. 从 Github 下载 ruby​​-filewatch zip 文件:Jordan Sissel 的 ruby​​-filewatch git 存储库
  2. 将下载的 zip 文件解压到新目录
  3. 我必须更改 Ruby-filewatch\lib\filwatch\tail.rb 文件 -> 第 10 行,其中显示需要“JRubyFileExtension.jar”。我必须更改为需要“java/JRubyFileExtension.jar”,否则我会收到一个错误,即在尝试读取文件时无法找到 jar 文件。作为参考,使整行显示为:require "java/JRubyFileExtension.jar" if defined? JRUBY_VERSION
  4. 在 7-Zip 中打开 logstash-1.3.3-flatjar.jar 文件
  5. 将 ruby​​-filewatch 中的 java 目录拖放到 7-Zip 的根文件夹中
  6. 将所有文件从 ruby​​-filewatch\lib\filewatch 文件夹拖放到 7-Zip 中的 filewatch 文件夹中,覆盖所有现有文件

现在,当您针对多个日志文件运行它时,您应该会发现 sincedb 包含多个条目,并且这些条目看起来类似于 1717916447-2604966-851968 0 2 428312038。如果您在查找 sincedb 文件时遇到问题并且尚未设置 sincedb_path在您的配置文件中,可以在运行 jar 的用户的主目录中找到它。如果这是您的用户,您可以使用 Windows 键 + 运行 -> %USERPROFILE% -> OK 轻松访问它。

在部署到生产系统之前,在彻底修补和测试时要小心谨慎。

于 2014-02-02T11:11:55.847 回答