我正在将Fluentd与Elasticsearch用于来自Kubernetes的日志,但我注意到一些JSON日志无法正确编入索引,因为JSON存储为字符串。
kubectl日志的日志如下所示:
{"timestamp":"2016-11-03T15:48:12.007Z","level":"INFO","thread":"cromwell-system-akka.actor.default-dispatcher-4","logger":"akka.event.slf4j.Slf4jLogger","message":"Slf4jLogger started","context":"default"}
但保存在/ var / log / containers / ...文件中的日志已经转义了引号,并使它们成为字符串而不是JSON,这会损坏索引:
{"log":"{\"timestamp\":\"2016-11-03T15:45:07.976Z\",\"level\":\"INFO\",\"thread\":\"cromwell-system-akka.actor.default-dispatcher-4\",\"logger\":\"akka.event.slf4j.Slf4jLogger\",\"message\":\"Slf4jLogger started\",\"context\":\"default\"}\n","stream":"stdout","time":"2016-11-03T15:45:07.995443479Z"}
我正在尝试让日志看起来像:
{
"log": {
"timestamp": "2016-11-03T15:45:07.976Z",
"level": "INFO",
"thread": "cromwell-system-akka.actor.default-dispatcher-4",
"logger": "akka.event.slf4j.Slf4jLogger",
"message": "Slf4jLogger started",
"context": "default"
},
"stream": "stdout",
"time": "2016-11-03T15: 45: 07.995443479Z"
}
你能建议我怎么做吗?
答案 0 :(得分:0)
我遇到了同样的问题,但是我正在使用fluent-bit
(Ruby)的“ C”版本fluentd
。由于这是一个较旧的问题,因此我为其他发现此问题的人提供帮助。
在fluent-bit
v0.13中,他们解决了这个问题。现在,您可以通过注释指定要使用的解析器。可以将解析器配置为将日志解码为json。
带有解码器的最终解析器如下:
[PARSER]
Name embedded-json
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
Time_Keep On
# Command | Decoder | Field | Optional Action
# =============|==================|=======|=========
Decode_Field_As escaped log do_next
Decode_Field_As json log