node-bunyanを使ったAWS Lambdaでのロギング処理

Atsushi Nakajo
4 min readApr 20, 2018

--

CloudWatch LogにJSONフォーマットで出力させたい

AWS Lambdaではログの出力先としてCloudWatch Logsがサポートされている。Lambdaランタイムの一つであるJavaScriptの場合、console.logを使えばCloudWatch Logsへ転送される。

これ自体は手軽で便利なのだが、ログの二次加工などを考えるとJSON形式にしておきたいところ。また、CloudWatch LogのフィルタはJSONもサポートしているので、JSON形式で出力させておくとKeyValue形式でフィルタできるというメリットもある。

node-bunyan

bunyanはJSONでのロギングを容易にできるライブラリ。バニヤンって呼ぶのかな?Wikipediaにはイギリスの文学者に同名がいたが、どうなんでしょ?

このライブラリ自体は最近ウォッチしていたhttps://github.com/integrations/slack 経由でみつけてたもので、これの良い所は最初からJSON形式で出力してくれるという点。

bunyanの使い方

まずはインストール。

npm install bunyan

使い方は簡単。createLoggerでnameを設定し、あとは使うだけ。これだけでJSON形式に出力してくれる。

JSON化されたログには最初からタイムスタンプなどが含まれているので、便利である。

$ node bunyan-sample.js
{"name":"myapp","hostname":"mba-2013.local","pid":11015,"level":30,"msg":"hi","time":"2018-04-18T16:23:35.408Z","v":0}
{"name":"myapp","hostname":"mba-2013.local","pid":11015,"level":40,"lang":"fr","msg":"au revoir","time":"2018-04-18T16:23:35.409Z","v":0}

log levelを数字からラベルに変更してみる

上記の出力サンプルをみると、level:30と出力されている。30はbunyanだとinfoレベルを表しており、初期設定ではレベルの出力は数値となっている。

自分の用途では見やすさ優先でラベルにしたかったので、bunyan-formatをつかってフォーマットをカスタマイズした。

  • levelInString: レベル出力の設定
  • outputMode: bunyanはJSON形式(インデント数を指定できるjsonもある)
$ node bunyan-format-sample.js
{"name":"myapp","hostname":"mba-2013.local","pid":1097,"level":"INFO","msg":"hi","time":"2018-04-19T14:35:42.857Z","v":0}
{"name":"myapp","hostname":"mba-2013.local","pid":1097,"level":"WARN","lang":"fr","msg":"au revoir","time":"2018-04-19T14:35:42.862Z","v":0}

まとめ

bunyanでは他にもlog.childなど、ロガーで欲しくなる機能が標準装備されている。なにより、定義してすぐ使えるのが使う側に取っては嬉しい。bunyan、手軽でいいね 😃

--

--