我不确定这个答案是否会涵盖您的案例,但它可能会为像我这样的人节省几个小时的调查时间。
虽然 format 参数现在是 deprecated 并替换为 <parse>,
它确实支持json解析。
这里的关键是 JSON 对象 structure。
第一个 nginx 访问日志示例,我已经 found do NOT work 与 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 要求它在单个键下至少嵌套一次。 (至少在这个例子中使用了 fluentd 代理,其他情况不确定)
这可以是下面 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 级别上使用 httpRequest,请注意它有 different purpose。