Pino

Node.js向けの超高速JSONロギングライブラリ。非同期処理に最適化され、Winstonより5-10倍高速なパフォーマンスを実現。CPU使用率を最小化し、本番環境での大量ログ処理に特化。ログレベル、機密データ編集、ストリーム多重化をサポート。

ログJSON高速Node.js構造化ログ

GitHub概要

pinojs/pino

🌲 super fast, all natural json logger

ホームページ:http://getpino.io
スター15,768
ウォッチ83
フォーク909
作成日:2016年2月16日
言語:JavaScript
ライセンス:MIT License

トピックス

fastjsonloggernodejspino

スター履歴

pinojs/pino Star History
データ取得日時: 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