Node.js の Lambda ログのフォーマットについて
console.log
Node.js の AWS Lambda のログについて、公式ドキュメントでは console.log, console.info, console.warn, console.error を使うと良い、とある。 これに対してログの出力結果は以下のような感じ。大抵はこれで良いのだが、これだと問題がある場合がいくつかある。
https://gyazo.com/0380c3b335ca02db0e041ee808373d7e
簡単だしちゃんと動作するのでこれで問題ないのだが、下記のような問題がある。
contextual な情報を含めるのが難しい
メッセージが構造化されていない
構造化されていないと、メッセージに情報が含まれていても自動的な抽出が困難
特定情報によるフィルタリングが困難
設定によるログレベルのコントロールが困難
dev 環境では debug レベル、本番環境では info, warning レベル、など
Structured Logs
ログは、平易なメッセージではなく、JSON で構造化するのが良い、という話があるようだ。
JSON 形式の良いところは、ログが構造化されているので自動的な抽出が容易という点と、CloudWatch Logs のフィルタ機能が JSON をサポートしている点。
JSON 形式でログを記録する方法は色々あると思うけど、Node.js だと、node-bunyan という、JSON でのロギングを容易にできるライブラリがあるらしい。node-restify 等のライブラリでロギングに利用されているようだ。 node-bunyan
Lambda で使ってみる
インストール。
code:shell
yarn add bunyan
例えば、Lambda にあげるコードに以下のような記述をしておく。
code:javascript
const bunyan = require('bunyan');
const logger = bunyan.createLogger({ name: 'my-home-skill' })
logger.info('test1')
logger.warn({ lang: 'ja' }, 'test2')
と、以下のように出力される。
https://gyazo.com/6914911b1a7acc72f0277626fb96557d
例えば、ログレベル info のものだけ出力したい場合は、{ $.level = "INFO" } 等で検索すれば良い。