at backyard

Color my life with the chaos of trouble.

Node.jsのlogger、pino(pino-http)を試してみる。

Node.js(Express)でサーバアプリケーションを書くことになった。

せっかくなので今まで利用したことのないloggerを利用してみたくなり、pinoを試してみることにした。

getpino.io

expressでpinoを利用する場合は pino-http を利用するらしい。

github.com

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.queryreq.params なども出力されるが、 req.body はそのままでは出力されない。
これについてはGitHubのissueに知りたい情報は書かれていた。

github.com

上のコメントに書かれているように req.body のログはデフォルトでは出力されないが、出すためには body-parserpino-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

github.com

シンプルにpino-httpでログを取りたい

ログローテーションなどは意識せずにログをファイルに書き込めればそれでいい、という場合は、pino-httpのコードに下記のオプションを放り込めばログファイルに書き込まれていく。

const pino = require("pino-http")({
 transport: {
   target: 'pino/file',
   options: {
     destination: './ログファイルのパス',
   },
 },
});

app.use(pino);

オプションの指定方法などは pino-http のドキュメントやあとは下記のドキュメントを見ておくと色々とわかりそうな気がしている。
(私もまだ把握しきれていない)

github.com

最後に

ひとまずザックリ試してみたメモのみ残した。
第一印象としては良い感じ。

後日 body-parser の件も検証してみます。