pinoはexpress.jsアプリケーションに組み込むことで、リクエストごとのログやエラーログなどを効率よく管理できます。以下では、express.jsでpinoを使った詳細なログ管理の方法を紹介します。
pinoに加えて、express.jsに特化したpino-httpというミドルウェアを利用します。これにより、HTTPリクエストやレスポンスに関するログを簡単に記録できます。
npm install pino pino-httpまず、pinoとpino-httpをexpress.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で起動しました');
});これで、リクエストごとのログ(メソッド、パス、ステータスコード、レスポンス時間など)が自動的に記録されるようになります。
pinoはデフォルトでJSON形式でログを出力するため、開発時にはpino-prettyで見やすい形式に整形することが推奨されます。
npm install pino-prettyconst logger = pino({
transport: {
target: 'pino-pretty',
options: {
colorize: true
}
}
});pino-prettyは、色付けや整形を行ってくれるため、デバッグが容易になります。詳細なオプションはpino-prettyのドキュメントを参照してください。
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}`);
});エラーハンドリングミドルウェアでもpinoを活用して、詳細なエラーログを記録できます。たとえば、予期せぬエラーが発生した場合に、エラー内容をログに記録します。
app.use((err, req, res, next) => {
req.log.error({ err }, 'Unhandled error occurred');
res.status(500).send('Internal Server Error');
});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}`);
});pinoは高速なロギングが特徴ですが、さらにアプリケーションのパフォーマンスを向上させるために、非同期のトランスポートを設定することも可能です。
const logger = pino({
transport: {
target: 'pino/file',
options: { destination: './logs/app.log' }
}
});この設定により、ログが別スレッドでファイルに記録され、メインの処理速度を向上させます。
pinoとpino-httpでExpress.jsに組み込むことで、簡単にログ管理ができます。pino-prettyで開発環境でのログを見やすく整形できます。- 構造化データを活用して、エラーハンドリングやリクエストごとの詳細な情報を記録可能です。