目次
🧷 pinoとは?
pinoは、パフォーマンスを最優先に設計されたNode.js向けのロガーライブラリです。
最大の特徴は、「速さ」 にあります。
- ログメッセージを非同期で処理し、JSON形式での出力に特化
- ロギング処理がアプリケーションのメインスレッドをブロックするのを最小限に抑え、アプリケーション全体のパフォーマンス低下を防止
特に、大量のログを高速に処理する必要があるマイクロサービスや、リソースが限られたサーバーレス環境などで真価を発揮します。
🧷 代表的なロガー
Node.jsでは、pino以外にも広く使われているロガーライブラリが存在します。
-
Winston
- 非常に多機能で、柔軟なカスタマイズが可能なロガー
- 複数の出力先(コンソール、ファイル、データベースなど)を組み合わせる「トランスポート」機能が強力
-
Bunyan
- pinoと同様に、構造化されたJSON形式のログ出力を基本とするロガー
- Netflixなどで採用実績あり
これらのロガーも素晴らしいツールですが、「パフォーマンス」 という点においてはpinoに軍配が上がります。
ベンチマークによると、pinoは1秒間に30,000行以上のログを問題なく記録可能。(winstonよりも約10倍高速)
🧷 pinoを使うメリット、デメリット
メリット
1. 圧倒的なパフォーマンス
- 他のロガーライブラリと比較して、非常に高速かつ低オーバーヘッド
- 非同期I/Oと効率的なJSONシリアライズにより、本番環境でのパフォーマンス影響を最小限に抑える
- デフォルトで非同期にログを書き込む = メインスレッドを占有しない
2. 構造化ロギング
- ログをJSON形式で出力するため、
DatadogやCloudWatchといったログ集約プラットフォームでの集計や分析が容易
3. 軽量性
- 意図的に軽量に作られており、CPUやメモリの消費量が少ないため、リソースが限られた環境でも安心して利用可能
デメリット
1. 可読性
- 開発中にコンソールでログを確認する場合、整形されていないJSONの読みづらさがあります。
pino-prettyというツールを使うことで、読みやすい形式に変換可能
2. 柔軟性のためには要追加設定
-
Winstonのように、設定オブジェクト一つでファイル書き出しや複数トランスポートを同時に定義するような柔軟性はない
-
ファイルへの出力やログローテーションを行いたい場合は、専用のトランスポートライブラリと組み合わせて実現する必要がある
- ログローテーション
ログファイルが肥大化するのを防ぐために、一定のサイズや期間で古いログを新しいログに切り替える仕組み
- ログローテーション
他の代表的なロガーとの比較
| 特徴 | pino | Winston | Bunyan |
|---|---|---|---|
| パフォーマンス | ◎ 非常に高速 | △ 柔軟な分、速度は劣る | ◯ 高速 |
| メモリ使用量 | ◎ 非常に少ない | △ 機能が多い分、消費量も多い | ◯ 少ない |
| 出力形式 | JSON (特化) | 複数形式に対応 | JSON (基本) |
| 柔軟性・拡張性 | ◯ (プラグインで拡張) | ◎ 非常に高い | ◯ |
| フォーマッティング | pino-pretty | Built-in | Pretty-json |
| TypeScriptとの相性 | ◎ 非常に良い | ◯ 良い | △ 悪い |
| 主な用途 | パフォーマンス重視のAPI、マイクロサービス | 多様な出力先が必要なアプリケーション | 構造化ログが必要なシステム |
import pino, { Logger } from 'pino';
// pinoのインスタンスを作成 (型はLogger)
const logger: Logger = pino();
// 各レベルでログを出力
logger.info('情報ログ');
logger.warn('警告ログ');
logger.error('エラーログ');
// 型を定義してオブジェクトを渡す
interface User {
name: string;
role: 'admin' | 'guest';
}
const user: User = { name: 'X', role: 'admin' };
logger.info({ user }, 'User Login'); // { user: User }
🧷 まとめ
pinoは、Node.jsアプリケーションのパフォーマンスを損なうことなく、効率的なロギングを実現したい場面で推奨できるロガーになります。
- とにかく速いロガーが欲しい
- ログはJSON形式で管理したい
- マイクロサービスやサーバーレス環境で使いたい