使用Fluentd进行日志记录 - 为什么json日志文件的输出显示为textpayload(而不是jsonpayload)?

时间:2017-10-23 16:41:39

标签: json logging fluentd stackdriver google-kubernetes-engine

我是Fluentd的新手。我在GKE中使用stackdriver,我在GKE中自定义Fluentd配置以对日志进行一些更改。

在我的容器日志的配置文件中,我有:

<source>
  type tail
  format json
  time_key time
  path /var/log/containers/*.log
  pos_file /var/log/gcp-containers.log.pos
  time_format %Y-%m-%dT%H:%M:%S.%N%Z
  tag reform.*
  read_from_head true
</source>

一些容器的日志是json objests,但我看到它们的输出为textpayload(当我在GKE上启用内置的Fluentd时,它们显示为jsonpayload)。

我不明白可能导致这种情况的原因。 我很感激任何建议。

2 个答案:

答案 0 :(得分:2)

我不确定这个答案是否会涵盖你的案件,但它可以节省几个小时的调查时间给我这样的人。

虽然格式参数现在为deprecated,但已替换为<parse>, 它确实支持json解析。

这里至关重要的是JSON对象structure 第一个nginx访问日志示例,我found 无法正常工作而没有修改:

log_format json_combined escape=json '{ "time_local": "$time_local", '
 '"remote_addr": "$remote_addr", '
 '"remote_user": "$remote_user", '
 '"request": "$request", '
 '"status": "$status", '
 '"body_bytes_sent": "$body_bytes_sent", '
 '"request_time": "$request_time", '
 '"http_referrer": "$http_referer", '
 '"http_user_agent": "$http_user_agent" }';

这不起作用,因为JSON是单级的,而Stackdriver要求它在一个键下至少嵌套一次。 (至少在本例中使用流利的代理,对其他情况不确定)

这可以是下面工作示例中的 accessLog 等任何关键字。

log_format json_combined escape=json '{ "accessLog": { "time_local": "$time_local", '
 '"remote_addr": "$remote_addr", '
 '"remote_user": "$remote_user", '
 '"request": "$request", '
 '"status": "$status", '
 '"body_bytes_sent": "$body_bytes_sent", '
 '"request_time": "$request_time", '
 '"http_referrer": "$http_referer", '
 '"http_user_agent": "$http_user_agent" } }';

如果在第一个JSON级别上使用 httpRequest ,则会警告它有different purpose

答案 1 :(得分:-1)

您的流利提取器不知道如何解析日志条目。 因此,您需要将日志行拆分为字段,它们将作为jsonpayload出现在Stackdriver Logging中。 例如,这是使用Nginx访问日志解析器

<source>
  @type tail
  format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/nginx/*.access.log
  path_key log_path
  pos_file /var/lib/google-fluentd/pos/nginx-access.pos
  read_from_head true
  tag nginx-access
</source>