winstonを使ってNode.jsで簡単ログ出力
「winston」はNode.jsのための高機能ロギングライブラリで、ログの収集、保存、管理を効率化します。
winstonは柔軟な設定と高い拡張性を持ち、コンソールやファイルなど様々な出力先にログを送信できます。この機能により、アプリケーションの状態監視やエラートラッキングが容易になり、運用時のデバッグが効率化されます。特に、Node.jsアプリケーションでのログ管理が重要なシステムでは、winstonの導入により信頼性と可視性が向上します。
インストール
npm install winston
ロガーの生成
ロガーインスタンスの生成例です。書き込み先は複数指定することが可能です。
const winston = require('winston');
const logger = winston.createLogger({
level: "ログレベル文字列",
format: "出力フォーマット",
transports: [
"書き込み先(ファイルトランスポート)"
],
});
ログレベル
ログレベルの一覧を以下に示します。
error
warn
info
http
verbose
debug
silly
出力フォーマット
winstonでは複数のフォーマットをwinston.format.combine()
を使って組み合わせることが可能です。例えば、タイムスタンプを付与しつつ、ログをJSON形式で出力する設定は以下のようになります。
winston.format.combine(
winston.format.timestamp(),
winston.format.json(),
);
時刻フォーマット
winston.format.timestamp()
を使用すると、デフォルトではUTC時刻が出力されます。日本時間でログを出力したい場合は、次のようにカスタマイズできます。
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss.SSS'
})
ファイルトランスポートの設定
winston.createLogger()
メソッドのパラメータであるtransports
には、ログの出力先(トランスポート)を指定するインスタンスを設定します。
ここでは、通常のwinston.transports.File
に対して、ログローテーションありとログローテーションなしの2つの設定方法を紹介します。
1. ログローテーションあり
ログファイルを一定のサイズや個数でローテーションさせたい場合、winston.transports.File
を以下のように設定します。
この設定では、ログファイルのサイズが10MBを超えると新しいファイルにローテーションされ、最大10個のログファイルを保持します。古いログファイルは削除され、新しいログが追記されます。
const dirname = path.join(__dirname, 'log');
new winston.transports.File({
dirname: dirname, // 保存ディレクトリ
filename: "app.log", // 保存ファイル名
maxsize: 10 * 1024 * 1024, // ファイルサイズ 10MB
maxFiles: 10, // 最大ファイル数
tailable: true // 古いログを削除して新しいログを追記
});
2. ログローテーションなし
ログローテーションを行わずに1つのファイルにログを出力する場合は、以下のように設定します。
この設定では、1つのファイルにログが出力され続け、ファイルのサイズや個数でローテーションされることはありません。
const dirname = path.join(__dirname, 'log');
new winston.transports.File({
dirname: dirname, // 保存ディレクトリ
filename: filename: "app.log" // 保存ファイル名
});
ログ出力の方法
ログの出力には、主に2つのパターンがあります。どちらの方法を使用しても、ロガーインスタンス生成時に指定したログレベルを超えるログは出力されません。
1. メソッド名でログレベルを指定
特定のログレベルを直接指定するメソッドを使用します。たとえば、info
、warn
、error
などのメソッドでログレベルを決定します。
logger.error('error log');
logger.warn('warn log')
logger.info('info log');
logger.http('http log');
logger.verbose('verbose log');
logger.debug('debug log');
logger.silly('silly log');
2. log()メソッドのパラメータでログレベルを指定
もう一つの方法は、log()
メソッドを使用し、パラメータでログレベルを指定する方法です。
logger.log('error', 'error log');
logger.log('warn', 'warn log')
logger.log('info', 'info log');
logger.log('http', 'http log');
logger.log('verbose', 'verbose log');
logger.log('debug', 'debug log');
logger.log('silly', 'silly log');
インスタンス生成のサンプルコード
"use strict";
const path = require('path');
const winston = require('winston');
const dirname = path.join(__dirname, 'log');
const transportFile = new winston.transports.File({
dirname: dirname, // 保存ディレクトリ
filename: "app.log", // 保存ファイル名
maxsize: 10 * 1024 * 1024, // ファイルサイズ 10MB
maxFiles: 10, // 最大ファイル数
tailable: true // 古いログを削除して新しいログを追記
});
const logger = winston.createLogger({
level: "info",
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss.SSS'
}),
winston.format.json(),
),
transports: [
transportFile
],
});
logger.info('info log');