我是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)。
我不明白可能导致这种情况的原因。 我很感激任何建议。
答案 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>