Kubernetes将JSON日志保存到带有转义引号的文件中。为什么?

时间:2016-11-03 16:40:31

标签: json logging docker kubernetes fluentd

我正在将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"
}

你能建议我怎么做吗?

1 个答案:

答案 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