Pino
Node.js向けの超高速JSONロギングライブラリ。非同期処理に最適化され、Winstonより5-10倍高速なパフォーマンスを実現。CPU使用率を最小化し、本番環境での大量ログ処理に特化。ログレベル、機密データ編集、ストリーム多重化をサポート。
GitHub概要
スター15,768
ウォッチ83
フォーク909
作成日:2016年2月16日
言語:JavaScript
ライセンス:MIT License
トピックス
fastjsonloggernodejspino
スター履歴
データ取得日時: 2025/7/17 10:01
ライブラリ
Pino
概要
PinoはNode.js向けの非常に高速なJSONログ機能ライブラリです。超低オーバーヘッドによる優れたパフォーマンスを実現し、構造化ログとして完全なJSON出力をサポートします。本番環境での高負荷アプリケーションに最適化されています。
詳細
Pinoは「低レイテンシーロギング」をコンセプトに設計されており、ログ出力によるアプリケーションのパフォーマンス影響を最小限に抑えます。Worker Threadsを活用した非同期処理と、最小限のシリアライゼーションによって、従来のロガーより6倍以上高速な処理を実現します。
主な特徴
- 超高速ログ処理: Worker Threads活用による非同期処理
- JSON構造化ログ: 完全なJSON形式での出力
- 軽量設計: 最小限の依存関係
- 豊富なトランスポート: ファイル、ストリーム、外部サービス対応
- 子ロガー: コンテキスト付きログの作成
メリット・デメリット
メリット
- Node.jsエコシステム最高レベルの性能
- JSON形式により監視ツールとの親和性が高い
- 設定が簡単で学習コストが低い
- メモリ使用量が非常に少ない
- TypeScript対応で型安全性を確保
デメリット
- JSON専用のため人間が読むには不向き
- カスタム出力フォーマットの作成が複雑
- 他の言語での類似ライブラリが限定的
- リッチな機能(カラー出力等)は別途プラグインが必要
参考ページ
書き方の例
基本的なセットアップ
npm install pino
基本的な使用方法
const pino = require('pino')
const logger = pino()
logger.info('Hello Pino!')
logger.error('エラーが発生しました')
// 出力例: {"level":30,"time":1640995200000,"pid":12345,"hostname":"myserver","msg":"Hello Pino!"}
設定とカスタマイズ
const pino = require('pino')
const logger = pino({
level: 'debug',
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',
ignore: 'pid,hostname'
}
}
})
logger.debug('デバッグメッセージ')
logger.info('情報メッセージ')
logger.warn('警告メッセージ')
logger.error('エラーメッセージ')
構造化ログ
const logger = pino()
// オブジェクトを含むログ
logger.info({ userId: 123, action: 'login' }, 'ユーザーがログインしました')
// エラーオブジェクトのログ
try {
throw new Error('データベース接続エラー')
} catch (error) {
logger.error({ error }, 'データベースエラーが発生')
}
// カスタム情報の追加
logger.info({
requestId: 'req-001',
method: 'POST',
url: '/api/users',
responseTime: 150
}, 'API リクエスト完了')
子ロガーとコンテキスト
const logger = pino()
// 子ロガーの作成(共通プロパティ付き)
const childLogger = logger.child({
module: 'user-service',
version: '1.2.0'
})
childLogger.info('ユーザーサービス開始')
// リクエスト固有の子ロガー
const requestLogger = logger.child({
requestId: 'req-123',
userId: 456
})
requestLogger.info('処理開始')
requestLogger.info('データベース検索完了')
requestLogger.info('処理完了')
ファイル出力とローテーション
const pino = require('pino')
const fs = require('fs')
// ファイル出力
const logFile = fs.createWriteStream('./app.log', { flags: 'a' })
const logger = pino(logFile)
// ローテーション付きファイル出力
const logger2 = pino(pino.destination({
dest: './app.log',
minLength: 4096,
sync: false
}))
// 複数出力先
const streams = [
{ stream: process.stdout },
{ level: 'error', stream: fs.createWriteStream('./error.log') },
{ level: 'fatal', stream: process.stderr }
]
const logger3 = pino({
level: 'debug'
}, pino.multistream(streams))
本番環境での設定
const pino = require('pino')
const isProduction = process.env.NODE_ENV === 'production'
const logger = pino({
level: isProduction ? 'info' : 'debug',
redact: ['password', 'creditCard'], // 機密情報の除去
timestamp: pino.stdTimeFunctions.isoTime,
formatters: {
level(label) {
return { level: label }
}
},
transport: !isProduction ? {
target: 'pino-pretty',
options: { colorize: true }
} : undefined
})
module.exports = logger