2015-02-10 68 views
3

我一直在尝试将日志从logstash发送到elasticsearch.Suppose我正在运行logstash实例,并在运行时对logstash实例所在的文件进行了更改监控,那么先前保存在elasticsearch中的所有日志都会再次保存,因此会形成重复。在logstash实例运行时将条目复制到Elastic Search

另外,当logstash实例关闭并重新启动时,日志会在elasticsearch中重复。

如何解决此问题? 如何仅将文件中最新添加的条目从logstash发送到elasticsearch? 我logstash instance命令如下: 斌/ logstash -f logstash-complex.conf

和配置文件是这样的:

input 
{ 
    file 
{ 

    path => "/home/amith/Desktop/logstash-1.4.2/accesslog1" 

    } 
} 

filter 
{ 
    if [path] =~ "access" 
{ 
    mutate 
{ 
replace => 
{ "type" => "apache_access" } } 
    grok { 
     match => { "message" => "%{COMBINEDAPACHELOG}" } 
    } 
    } 
    date { 
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] 
    } 
} 

output { 
    elasticsearch { 
    host => localhost 
    index => feb9 
    } 
    stdout { codec => rubydebug } 
} 

回答

0

正如你在你的问题中提到。

当logstash实例关闭并再次重新启动时,日志在elasticsearch中被复制。

因此,它可能已经删除了.since_db。请看here。 尝试具体的since_dbstart_position。例如:

input 
{ 
    file 
    { 
     path => "/home/amith/Desktop/logstash-1.4.2/accesslog1" 
     start_position => "end" 
     sincedb_path => /home/amith/Desktop/sincedb 
    } 
} 
+0

如果我创建的文件是一个新文件,start_position必须指向文件的开头,该怎么办? – 2015-02-10 11:33:33

+0

进行上述更改后仍然重复。 – 2015-02-10 11:44:10

+0

你使用什么操作系统?如果您在窗口上运行,则存在logstash上的错误。 https://logstash.jira.com/browse/LOGSTASH-429 – 2015-02-12 00:40:42

4

我得到了解决方案。 我正在打开文件,添加一条记录并保存它,因为每次保存文件时,logstash都会将同一个文件作为不同的文件处理,因为它为同一个文件记录了不同的inode编号。

解决方法是在不打开文件的情况下向文件追加一行,但通过运行以下命令。

回声>>文件名“要添加到文件中的字符串”

1

[ELK堆栈] 我想一些定制CONFIGS在

/etc/logstash/conf.d/vagrant.conf 

所以第一步是使备份:/etc/logstash/conf.d/vagrant.conf.bk 这导致logstash在elasticseach中添加两个条目,每个条目在<file>.log; 相同,如果我有3个文件在/etc/logstash/conf.d/*.conf.*在ES我有8条目在*.log

相关问题