Closed4

Node.jsでGKEに綺麗にロギングしたい

ロピタルロピタル

GKEのログの仕組み

https://www.kwbtblog.com/entry/2020/07/20/035720

GKEでクラスターを作成すると、デフォルトで各種ログがCloud Loggingに出力されるようになります。
ログにはコンテナからの標準出力・標準エラーも含まれていて、プログラムからは意識することなしに、標準出力・標準エラーに対して出力さえしておけば、同じものがCloud Loggingにも出力されてログとして残ります。

ロピタルロピタル

問題1: Winstonを使ったら重要度がERRORとして出力されない

winston.createLogger({
  level: logLevel,
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.errors({ stack: true }),
    format.json(),
  ),
  transports: [new winston.transports.Console()],
});

出力

他の方法

普通にconsole APIを使ってログを出力すれば、GKEのログにもERRORレベルとして出力される

console.error("This is an example erorr");

以下のように出力することでもERRORとして出力される

console.log(JSON.stringify({
   severity: 'ERROR',
   message: 'This is testing a structured log error for GCP'
}));

出力

ロピタルロピタル

問題1の解決策①

severity: <Log Lebel>を出力するJSONに含める
https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity

winston.createLogger({
  level: logLevel,
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.errors({ stack: true }),
    format.json(),
  ),
  format((info) => {
        let level = info.level.toUpperCase();
        if (level === 'VERBOSE') {
          level = 'DEBUG';
        }
        info['severity'] = level;
        return info;
      })(),
  transports: [new winston.transports.Console()],
});

出力

なぜ?

logger.add(new winston.transports.Console(options));

optionsで設定しないと、デフォルトでは全てのlog levelがstdoutで出力されるらしい。解決策は次の投稿にあります。

winston.createLogger({
  level: logLevel,
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.errors({ stack: true }),
    format.json(),
  ),
  transports: [new winston.transports.Console()],
});

https://github.com/winstonjs/winston/blob/master/docs/transports.md#built-in-to-winston

ロピタルロピタル

問題1の解決策②

winstonはデフォルトで、全てのlog levelでstdoutで出力されるので、stderrを使うように設定する。

winston.createLogger({
  level: logLevel,
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.errors({ stack: true }),
    format.json(),
  ),
  transports: [
    new winston.transports.Console({ stderrLevels: ['debug', 'error'] }), // ここ
  ],
});
このスクラップは2021/06/06にクローズされました