@google-cluod/logging-winston
from Cloud Logging
そんなに使いたくない
metadata
オレの logging winston の嫌いな点のひとつ、まず winston の metadata という名前が嫌いで、String のログメッセージに追加で情報を付加する Object を意味する、logger.info(message, metadata?) みたいな感じ
metadata と聞くとログ本体ではない二義的な情報を意味しそうだが、アプリケーションで大抵の場合見たいのはmetadata の方である。これが jsonPayload.metadata に記録される。
Stackdriver Logging のログエントリの metadata と近い位置にあるのに意味が違うのも嫌
LogEntry  |  Cloud Logging  |  Google Cloud
こちらは MonitoredResourceMetadata であり、deprecated なフィールド
@google-cloud/logging, @google-cloud/logging-winston で entryMetadata という呼称もある
こちらは timestamp や labels など、ログエントリ共通の予約フィールドなどを表す概念
https://github.com/googleapis/nodejs-logging-winston/blob/master/src/common.ts#L150
winston はみんなのものなのだが、Cloud Logging のユーザの気持ちとしては metadata の階層は要らなくてそのまま jsonPayload として扱って欲しい(ログメッセージは jsonPayload.message フィールドに書けば行の代表的なメッセージとして採用される)
書き込み完了を待つ
logging methods no longer take a callback, can't reliably use it in some environments (AWS Lambda) · Issue #1250 · winstonjs/winston
end しないと flush 待てない?
child を作ったあと親を end したら child の stream も止まってるのでエラーになる
winston/finish-event.js at c868f0ccdc6ddc45e586c9808d99ebae8351113b · winstonjs/winston
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)
}
特別扱いされるフィールド
nodejs-logging-winston/common.ts at master · googleapis/nodejs-logging-winston
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 にセットされる
https://github.com/googleapis/nodejs-logging-winston/blob/master/src/common.ts#L157
entryMetadata.logName は project/{projectId}/logs/{logId} の形式を期待している
https://github.com/googleapis/nodejs-logging/blob/master/src/log.ts#L115
部分的に logName を変えたいときは entryMetadata.name にセットすべき?
https://github.com/googleapis/nodejs-logging/blob/master/src/log.ts#L123
https://github.com/googleapis/nodejs-logging/blob/master/src/log.ts#L853
だが、logging-winston は name を特別扱いしない
#Cloud_Logging #GoogleCloud #npm