如果日志中的文档时间字段早于文档中的当前时间字段,则Logstash会忽略文档更新

时间:2018-08-14 18:57:24

标签: elasticsearch logstash

我正在使用logstash处理日志文件。我的日志文件中的字段之一是日期类型,其格式为:yyyyMMddHHmmssSSS

我将我的日志文件的每一行读入Elasticsearch的索引中的文档中。我的日志文件中的示例行如下所示:

{
    "_source": {
      "sku": "0000000",
      "time": "20180813124704961",
      "location": "Chicago",
      "quantity": 5
    }
  }

反过来,我索引中的文档结构如下:

elasticsearch {
    hosts => "http://localhost:9200"
    index => "logstash"
    scripted_upsert => true
    script => "if(ctx.op == create || params.event.get('time').compareTo(ctx._source.time) > 0) ctx._source = params.event"
  }

我的日志一直在更新,因此我想防止索引中的数据过时。在下一次处理日志文件时,如何检查索引中的时间字段是否比同一行旧或新?

例如,如果日志文件同一行中的时间字段更改为比上述时间更旧,则文档不应更新,但是,如果时间字段值较新,则应该更新已更新。

这是我尝试过的(logstash.conf):

tr

非常感谢。

1 个答案:

答案 0 :(得分:0)

我为那些也可能遇到类似问题的人发布了答案。

scripted_upsert => true
    action => "update"
    script_lang => "painless"
    script_type => "inline"
    script => "if(ctx.op == 'create' || params.event.time.compareTo(ctx._source.time) > 0) ctx._source = params.event;"

文档尚不十分清楚,但是您可以通过params.event.YOUR_FIELD.compareTo进入json直接访问文档中的字段,然后您可以对数据执行任意脚本。

Event是默认变量名,但是您可以通过params

进入事件