Skip to content

Instantly share code, notes, and snippets.

@yukikim
Created November 15, 2024 03:36
Show Gist options
  • Save yukikim/e96f0ad5173be2b7002475d8972d45cf to your computer and use it in GitHub Desktop.
Save yukikim/e96f0ad5173be2b7002475d8972d45cf to your computer and use it in GitHub Desktop.
pino使い方

pinoexpress.jsアプリケーションに組み込むことで、リクエストごとのログやエラーログなどを効率よく管理できます。以下では、express.jspinoを使った詳細なログ管理の方法を紹介します。

1. pinopino-httpのインストール

pinoに加えて、express.jsに特化したpino-httpというミドルウェアを利用します。これにより、HTTPリクエストやレスポンスに関するログを簡単に記録できます。

npm install pino pino-http

2. 基本的な使い方(Expressにpinoを組み込む)

まず、pinopino-httpexpress.jsに組み込み、ミドルウェアとして設定します。

import express from 'express';
import pino from 'pino';
import pinoHttp from 'pino-http';

const app = express();

// ロガーの設定
const logger = pino({
  level: 'info',
  transport: {
    target: 'pino-pretty', // ログの見やすさを改善
    options: { colorize: true }
  }
});

// pino-http ミドルウェアの設定
const httpLogger = pinoHttp({ logger });
app.use(httpLogger);

// ルートハンドラの設定
app.get('/', (req, res) => {
  req.log.info('ルートエンドポイントにアクセスされました'); // 各リクエストに固有のロガーがある
  res.send('Hello, World!');
});

app.listen(3000, () => {
  logger.info('サーバーがポート3000で起動しました');
});

これで、リクエストごとのログ(メソッド、パス、ステータスコード、レスポンス時間など)が自動的に記録されるようになります。


3. pino-prettyを使って出力を整形する

pinoはデフォルトでJSON形式でログを出力するため、開発時にはpino-prettyで見やすい形式に整形することが推奨されます。

npm install pino-pretty
const logger = pino({
  transport: {
    target: 'pino-pretty',
    options: {
      colorize: true
    }
  }
});

pino-prettyは、色付けや整形を行ってくれるため、デバッグが容易になります。詳細なオプションはpino-prettyのドキュメントを参照してください。


4. カスタムロガーで詳細なログ管理

pino-httpを使うことで、req.logオブジェクトが使用可能になり、各エンドポイントやミドルウェア内で個別のログを出力できます。たとえば、エンドポイントごとのアクセスログや処理時間を記録できます。

app.get('/user/:id', (req, res) => {
  const userId = req.params.id;
  req.log.info(`User ${userId}にアクセス`);

  // 例:データベースからユーザー情報を取得する処理
  // const user = getUserFromDatabase(userId);

  res.send(`User ID: ${userId}`);
});

5. エラーハンドリングでのログ出力

エラーハンドリングミドルウェアでもpinoを活用して、詳細なエラーログを記録できます。たとえば、予期せぬエラーが発生した場合に、エラー内容をログに記録します。

app.use((err, req, res, next) => {
  req.log.error({ err }, 'Unhandled error occurred');
  res.status(500).send('Internal Server Error');
});

6. JSON フォーマットでの構造化ログ

pinoはデフォルトでJSON形式でログを出力するため、アプリケーションの詳細な状態をログに含めることができます。構造化されたデータを使って、フィルタリングや検索が容易になります。

app.get('/order/:id', (req, res) => {
  const orderId = req.params.id;

  // 構造化データとしてログに記録
  req.log.info({
    event: 'fetch_order',
    orderId: orderId,
    userId: req.user.id  // 任意のユーザー情報
  }, 'Order request received');

  res.send(`Order ID: ${orderId}`);
});

7. 非同期ロギング

pinoは高速なロギングが特徴ですが、さらにアプリケーションのパフォーマンスを向上させるために、非同期のトランスポートを設定することも可能です。

const logger = pino({
  transport: {
    target: 'pino/file',
    options: { destination: './logs/app.log' }
  }
});

この設定により、ログが別スレッドでファイルに記録され、メインの処理速度を向上させます。


まとめ

  • pinopino-httpでExpress.jsに組み込むことで、簡単にログ管理ができます。
  • pino-prettyで開発環境でのログを見やすく整形できます。
  • 構造化データを活用して、エラーハンドリングやリクエストごとの詳細な情報を記録可能です。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment