Closed4
Node.jsでGKEに綺麗にロギングしたい
GKEのログの仕組み
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に含める
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()],
});
問題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にクローズされました