@google-cluod/logging-winston
そんなに使いたくない
metadata
オレの logging winston の嫌いな点のひとつ、まず winston の metadata という名前が嫌いで、String のログメッセージに追加で情報を付加する Object を意味する、logger.info(message, metadata?) みたいな感じ
metadata と聞くとログ本体ではない二義的な情報を意味しそうだが、アプリケーションで大抵の場合見たいのはmetadata の方である。これが jsonPayload.metadata に記録される。
Stackdriver Logging のログエントリの metadata と近い位置にあるのに意味が違うのも嫌
こちらは MonitoredResourceMetadata であり、deprecated なフィールド
@google-cloud/logging, @google-cloud/logging-winston で entryMetadata という呼称もある
こちらは timestamp や labels など、ログエントリ共通の予約フィールドなどを表す概念
winston はみんなのものなのだが、Cloud Logging のユーザの気持ちとしては metadata の階層は要らなくてそのまま jsonPayload として扱って欲しい(ログメッセージは jsonPayload.message フィールドに書けば行の代表的なメッセージとして採用される) 書き込み完了を待つ
end しないと flush 待てない?
child を作ったあと親を end したら child の stream も止まってるのでエラーになる
code:closeLogger.ts
export function closeLogger(logger: winston.Logger): Promise<unknown> {
const finishes = logger.transports.map(t => new Promise(done => t.once('finish', done)))
logger.end()
return Promise.all(finishes)
}
特別扱いされるフィールド
winston でのログメソッドの第二引数の metadata の一部フィールドで Stackdriver Logging 上で意味あるものは entryMetadata に採用される
resource, httpRequest, timestamp, labels など
これは便利だけど毎回コード読みに行くことになる
logId or logName
new LoggingWinston({ logName: ...}) は logId を期待している?
new Logging(options).log(<ここ>, { ... }) に渡される
logName を渡すと projects/pokutuna-dev/logs/projects%2Fpokutuna-dev%2Flogs%2hoge みたいになる
なので { logName: "hoge" } を渡す
これは @google-cloud/logging で Log.formatName_(logging.projectId, name) として projects/~ の形に整形される
child や winston の metadata として logName を書いたときは直接 entryMetadata.logName にセットされる
entryMetadata.logName は project/{projectId}/logs/{logId} の形式を期待している
部分的に logName を変えたいときは entryMetadata.name にセットすべき?
だが、logging-winston は name を特別扱いしない