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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Fluentd进行日志记录 - 为什么json日志文件的输出显示为textpayload(而不是jsonpayload)?相关的知识,希望对你有一定的参考价值。

我是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对象,但我看到它们的输出为textpayload(当我在GKE上启用内置的Fluentd时,它们显示为json有效负载)。

我不明白是什么原因引起的。我很感激任何建议。

答案

我不确定这个答案是否会涵盖你的案子,但它可以节省几个小时的调查时间,就像它可能对我有所帮助。

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

这里至关重要的是JSON对象structure。 第一个nginx访问日志示例,我found不使用Stackdriver而不进行修改:

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要求它在一个键下至少嵌套一次。 (至少在本例中使用流利的代理,对其他情况不确定)

这可以是下面的WORKING示例中的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级别上使用http请求,则会警告它有qazxsw poi。

另一答案

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

different purpose

以上是关于使用Fluentd进行日志记录 - 为什么json日志文件的输出显示为textpayload(而不是jsonpayload)?的主要内容,如果未能解决你的问题,请参考以下文章

Elastic:使用 Fluentd 及 Elastic Stack 进行应用日志采集

使用Fluentd收集Docker容器日志

用于多行的 Docker Fluentd 日志记录驱动程序

fluentd解析日志部分json

使用Docker搭建ELK日志搜集系统

Java 输出 JSON 日志