它有一个日志文件,其中存储带有时间戳和 json 消息的事件。例如:
时间戳 {"foo": 12, "bar": 13}
我想将 json 部分中的键(foo 和 bar)分解为 Logstash 输出中的字段。
我知道我可以将 Logstash 文件过滤器中的格式字段设置为 json_event 但在这种情况下我必须在 json 中包含时间戳。还有一个 json 过滤器,但它添加了一个具有完整 json 数据结构的字段,而不是使用键。
任何想法如何做到这一点?
它有一个日志文件,其中存储带有时间戳和 json 消息的事件。例如:
时间戳 {"foo": 12, "bar": 13}
我想将 json 部分中的键(foo 和 bar)分解为 Logstash 输出中的字段。
我知道我可以将 Logstash 文件过滤器中的格式字段设置为 json_event 但在这种情况下我必须在 json 中包含时间戳。还有一个 json 过滤器,但它添加了一个具有完整 json 数据结构的字段,而不是使用键。
任何想法如何做到这一点?
尝试最新的 logstash 1.2.1 并使用编解码器值直接解析 json 事件。
input {
file {
type => "tweetfile"
path => ["/home/nikhil/temp/feed/*.txt"]
codec => "json"
}
}
filter{
json{
source => "message"
target => "tweet"
}
}
output {
stdout { }
elasticsearch { embedded => true }
}
我已经使用以下配置完成了此操作:
filter {
grok {
match => ["message", "\[%{WORD}:%{LOGLEVEL}\] %{TIMESTAMP_ISO8601:tstamp} :: %{GREEDYDATA:msg}"]
}
date {
match => [ "tstamp", "yyyy-MM-dd HH:mm:ss" ]
}
json {
source => "msg"
}
}
顺便说一下,这是新版本 1.2.0 的配置。
在 1.1.13 版本中,您需要在 json 过滤器中包含一个目标,并且grok过滤器中消息的引用是@message。
您可以只使用普通的Grok 过滤器(正则表达式样式过滤器/模式)并将匹配的值分配给一个变量,以便于组织、过滤和搜索。
一个例子:
((?<foo_identifier>(\"foo\"))):((?<foo_variable_value>(\d+,)))
类似的东西。
如果您在语法、模式和您认为应该匹配但不匹配的东西上遇到困难,请使用GrokDebugger来帮助您。
希望那些对你有帮助。
你的 JSON 是错误的{"foo": 12, "bar" 13}
应该:
{"foo": 12, "bar": 13}