从头开始重新加载相同的文件,而不重新启动logstash

时间:2016-12-02 15:49:39

标签: elasticsearch logstash

我设法通过将sincedb_path指向NUL(Windows环境)并在开头设置start_position来强制Logstash重新加载整个文件。这是我的file input配置:

input {
     file {
        path => "myfile.csv"
        start_position => beginning
        ignore_older => 0
        type => "my_document_type"
        sincedb_path => "NUL"
        stat_interval => 1
    }
}

每次重新启动Logstash并且每次修改文件时都会重新加载该文件,但我希望每次重新加载该文件,如stat_interval中所述。
即使没有修改也没有重新启动logstash,我也需要重新加载它,因为我在过滤器中添加了一个基于日期的字段,我每天都需要相同的数据并使用更新的date_field

filter {
    csv {
        columns => ["MyFirstColumn", "MySecondColumn"]
        separator => ";"
        add_field => {
        "date_field" => "%{+ddMMyyy}"
        }
    }
}  

以下是预期行为的示例:

文件内容:

Column A;Column B
Value X;Value Y  

发送到弹性搜索索引的数据:

Column A : Value X, Column B : Value Y, date_field : 05122016

第二天,即使没有修改文件,我也希望将以下数据添加到Elasticsearch中的相同索引中:

Column A : Value X, Column B : Value Y, date_field : 06122016

1 个答案:

答案 0 :(得分:0)

我最后使用exec输入而不是file并启动cat命令每2秒读取一次文件。 cat命令检索整个文件内容,因此我使用第一个split过滤器分别检索每一行,然后使用csv过滤器分隔列。这是我的配置文件内容:

input {
    exec {
        command => "cat myfile.csv"
        interval => 2
        add_field => {
              "tag" => "mytag"
        }
    }
}
filter {    
    if [tag] == "mytag" {
        split {
            terminator => "\n"
        }
        csv {
            columns => ["myFirstColumn", "mySecondColumn", "mythirdColumn"]
            separator => ";"        
        }
}
output {
    if [tag] == "mytag" {
        elasticsearch {
            hosts => [ "localhost:9200" ]
            index => "myIndex"
        }
    }
}  

原始答案可在elastic discuss platform

中找到