Closed2

GKE上で動くnginxのアクセスログを構造化ログとしてCloud Loggingに書き込む

nmtynmty

Google Kubernetes Engine または App Engine フレキシブル環境を使用している場合は、構造化されたログを 1 行でシリアル化された JSON オブジェクトとして stdout または stderr に書き込めます。すると、構造化ログは、Logging エージェントにより、LogEntry 構造の jsonPayload として Cloud Logging に送信されます。

GKEの場合は、JSONオブジェクトで標準出力に書き込めば良い。

Default: access_log logs/access.log combined;

nginxのアクセスログの形式はデフォルトだと combined 。これをJSONにすれば良い。

Syntax: log_format name [escape=default|json|none] string ...;
...
For json escaping, all characters not allowed in JSON strings will be escaped: characters

escape=json を使う。

nmtynmty

設定

nginx.conf
http {
    log_format cloudlogging escape=json '{'
        '"timestamp":"$time_local",'
        '"httpRequest":{'
          '"remoteIp":"$remote_addr",'
          '"requestMethod":"$request_method",'
          '"requestUrl":"$request_uri",'
          '"requestSize":$request_length,'
          '"status":$status,'
          '"responseSize":$bytes_sent,'
          '"referer":"$http_referer",'
          '"userAgent":"$http_user_agent",'
          '"latency":"${request_time}s",'
          '"protocol":"$server_protocol"'
        '}'
    '}';

    server {
        access_log /dev/stdout cloudlogging;
        error_log  /dev/stderr;
    }
}

https://839.hateblo.jp/entry/2019/12/20/090000 を参考にさせていただいた。

ログエントリー

log_entry.json
{
    "jsonPayload": {
        "timestamp": "10/May/2020:00:00:00 +0000",
    },
    "httpRequest": {
    },
    "severity": "INFO"
}

上記設定で出力されるログエントリー。

このスクラップは2021/05/22にクローズされました