Logstash从日志消息中筛选时间戳

时间:2014-05-19 14:37:02

标签: logging elasticsearch timestamp logstash

我一直在关注Logstash教程,并为测试目的创建了以下配置文件:

input {
  file {
    path => "C:\Dev\sample.log"
    start_position => beginning
  }
}
filter{
    date {
        match => [ "logdate", "YYYY-MM-dd HH:mm:ss,SSS" ]
    }
}
output {
  elasticsearch { host => localhost
                  index => "test"
                }
  stdout { codec => rubydebug }
}

但是,输出的唯一字段是 "消息&#34 ;, " @版本&#34 ;, " @时间戳&#34 ;, "主机"和 "路径"

否" logdate"被检索。我已经搜索了一段时间,我看到人们在错误的日期格式下遇到了同样的问题,但我用#34; Joda-Time"正如Logstash教程推荐的那样。谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

通过执行以下操作,我设法得到了我想要的结果:

    input {
  file {
    path => "C:\Dev\sample.log"
    start_position => beginning
  }
}
filter{
    grok {
       match => [ "message", "%{TIMESTAMP_ISO8601:logdate}" ]
    }       
    date {
        match => [ "logdate", "YYYY-MM-dd HH:mm:ss,SSS"]
    }
}
output {
  elasticsearch { host => localhost
                  index => "test"
                }
  stdout { codec => rubydebug }
}

所以,这可能是我的问题的答案,我希望它可以帮助那些陷入困境的人。但是我仍然不明白为什么我之前的例子(在问题中)没有给我(我认为是)正确的输出?如果有人能给我一些解释,我真的很感激。非常感谢!

答案 1 :(得分:1)

首先,我需要说我只是新手,但我的理解如下:

在日期过滤器中,匹配是一个令人困惑的术语。它与单词的正则表达式不匹配,它解析一个字符串并将其转换为日期。它只是看一个字符串并说,"第一个字符是一年中的第一个数字"它不做的是在另一个字符串中找到指定格式的字符串(在你的情况下是整个消息)。这是grok的工作。

总而言之,grok找到一个看起来像日期的字符串,日期过滤器将字符串转换为日期。