Logstash-使用当前日期作为时间戳记日期

时间:2018-07-12 12:14:16

标签: elasticsearch logstash logstash-grok logstash-configuration

我想将当前日期用作时间戳记(日期),因为此信息在我们的日志文件中不可用。 示例-> main_core.log:

04:00:19.675 [ActiveMQ Task-9] INFO  a.b.c.t.failover.FailoverTransport - Successfully reconnected to ssl://localhost:12345

我想将其拆分,并使用当前日期作为日期和时间戳记从日志文件中删除。

那有可能吗?

感谢和许多问候

1 个答案:

答案 0 :(得分:0)

您可以添加一个字段,其中包含日志中缺少的时间戳部分,然后与包含小时的变量连接起来,并将其用作您的@timestamp字段。

下面的过滤器执行以下操作:

filter {
    grok {
        break_on_match => false
        match => ["message","%{TIME:hour} %{GREEDYDATA:msg}"]
        tag_on_failure => [ "_grokparsefailure"]
        add_field => { "time" => "%{+YYYY-MM-dd}"}
        add_field => { "timestamp" => "%{time} %{hour}" }
    }
    date {
        target => "@timestamp"
        match => ["timestamp", "YYYY-MM-dd HH:mm:ss.SSS"]
    }
}

首先,它将使您的消息与grok模式匹配,该模式将提取小时并将其保存在字段名称hour中,其余内容将保存在字段名称msg中,但是您可以如果需要,可以分析其余部分。

然后,它将添加带有格式YYYY-MM-dd的字段名time,例如2018-07-12

此后,它将创建一个名为timestamp的字段,其中字段time与字段hour,这将导致2018-07-12 4:00:19.675

date过滤器用于将您生成的时间戳记用作Elastic的默认时间戳记字段,即@timestamp

此过滤器的logstash输出如下:

{
 "@timestamp":"2018-07-12T04:00:19.675Z",
 "message":"04:00:19.675 [ActiveMQ Task-9] INFO a.b.c.t.failover.FailoverTransport - Successfully reconnected to ssl://localhost:12345",
 "timestamp":"2018-07-12 04:00:19.675",
 "msg":"[ActiveMQ Task-9] INFO  a.b.c.t.failover.FailoverTransport - Successfully reconnected to ssl://localhost:12345",
 "time":"2018-07-12",
 "@version":"1",
 "hour":"04:00:19.675",
 "host":"logstash-hostname"
}