使用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)?的主要内容,如果未能解决你的问题,请参考以下文章