Node.jsのlogger、pino(pino-http)を試してみる。
Node.js(Express)でサーバアプリケーションを書くことになった。
せっかくなので今まで利用したことのないloggerを利用してみたくなり、pinoを試してみることにした。
expressでpinoを利用する場合は pino-http
を利用するらしい。
pino-httpは高速に動作するNode.js製のHTTPロガーというのがウリ文句のようだが、READMEを見た限り、簡単に導入できそうだというのも私の背中を押してくれた。
というわけで、今回のポストは pino(正確には pino-http)
を試してみた備忘録となる。
目次
pino-httpの導入とHello World
インストールは下記のコマンドで行える。
yarn add pino-http
pino
自体は pino-http
に依存関係として設定されているので、pino-http
をインストールすると、pino
も利用できるようになる。
expressでのhello world的なコードは下記のようになる。
const app = require('express')() const pino = require('pino-http')() app.use(pino) app.get('/', function (req, res) { req.log.info('something') res.send('hello world') }) app.listen(3000)
app.use(pino)
することでreq.log
からpino
のロガーが使える。
また、上のように自身でログを設定することもできるが、このmiddlewareを設定すると、response時などにも勝手に pino-http
側でログを出力してくれる。
そのためミドルウェアの設定を行えば(app.use(pino))、必要最低限のログを出し始めるようになる。
req.body内のログについて
実際に吐き出されるログは多岐にわたり、req.query
や req.params
なども出力されるが、 req.body
はそのままでは出力されない。
これについてはGitHubのissueに知りたい情報は書かれていた。
上のコメントに書かれているように req.body
のログはデフォルトでは出力されないが、出すためには body-parser
を pino-http
の前に配置しておく必要があるようだ。
ちなみに現在expressでは app.use(express.json());
と書けば req.body
を参照できるようになるが、この記述を pino-http
の前に配置しても特にbody
の内容は表示されない。
// こんな感じで設定している
app.use(express.json());
app.use(pino);
もしかしたら body-parser
じゃないとだめなのか、それとも上のコメントの意図を自分が誤って理解しているのかはわからないが、ここらへんは後日検証してみようと思う。
ただ、上のコメントにも書かれているようにbodyのparseは巨大になる可能性もあるため、body自体の内容をログに残すのではなく必要なログだけを残すようにしておいたほうが良いと書かれている。
私もreq.body
内のログは必要最低限のもののみログとして残すようにしている。
下記のように明示的に書くことで必要最低限のログは記録できる。
req.log.info({hogehoge: req.body.hogehoge})
pino-httpを使ったログのファイル書き出し
pino-http
を使ったログの書き出しについては求められる要件に応じた、いくつかやり方がある。
pinoでのlog rotate
自分はまだ未検証なのでおそらくとなるが、log rorateなどの仕組みを導入してきっちりログ管理をしたい場合、pinoでは logrotate
の利用を勧めている。
https://getpino.io/#/docs/help?id=log-rotation
シンプルにpino-httpでログを取りたい
ログローテーションなどは意識せずにログをファイルに書き込めればそれでいい、という場合は、pino-http
のコードに下記のオプションを放り込めばログファイルに書き込まれていく。
const pino = require("pino-http")({ transport: { target: 'pino/file', options: { destination: './ログファイルのパス', }, }, }); app.use(pino);
オプションの指定方法などは pino-http
のドキュメントやあとは下記のドキュメントを見ておくと色々とわかりそうな気がしている。
(私もまだ把握しきれていない)
最後に
ひとまずザックリ試してみたメモのみ残した。
第一印象としては良い感じ。
後日 body-parser
の件も検証してみます。