ほぼあらゆるものに対応するロガー。
詳細については、アップグレード ガイドを参照してください。バグ報告やPRは大歓迎です!
[email protected]
ドキュメントをお探しですか?以下のドキュメントはwinston@3
用であることに注意してください。 [email protected]
ドキュメントを読んでください。
winston
は、複数のトランスポートをサポートするシンプルでユニバーサルなロギング ライブラリになるように設計されています。トランスポートは基本的にログのストレージ デバイスです。各winston
ロガーには、異なるレベル (ログ レベルを参照) で構成された複数のトランスポート (トランスポートを参照) を含めることができます。たとえば、エラー ログを永続的なリモートの場所 (データベースなど) に保存したい場合がありますが、すべてのログはコンソールまたはローカル ファイルに出力されます。
winston
ロギング プロセスの一部を分離して、ロギング プロセスをより柔軟で拡張可能にすることを目指しています。ログのフォーマット (「フォーマット」を参照) とレベル (「カスタム ログ レベルの使用」を参照) の柔軟性をサポートし、これらの API がトランスポート ログの実装から切り離されていることを確認することに注意が払われています (つまり、ログの保存/インデックス付け方法、「カスタムの追加」を参照) Transports) をプログラマに公開した API に転送します。
TL;DR? ./examples/
にあるクイック スタートの例を確認してください。 ./examples/*.js
には他にも多数の例があります。あるべきだと思う例が見つかりませんか?追加するにはプルリクエストを送信してください。
winston
推奨される使用方法は、独自のロガーを作成することです。これを行う最も簡単な方法は、 winston.createLogger
使用することです。
const winston = require('winston');const logger =winston.createLogger({ level: 'info', format:winston.format.json(),defaultMeta: { service: 'user-service' }, Transports: [ / / // - 「error」以上の重要度レベルを持つすべてのログを「error.log」に書き込みます // (つまり、エラー、致命的ですが、他のレベルは書き込みません) // new winston.transports.File({ filename: 'error.log', level: 'error' }), // // - 重要度レベルが `info` 以上のすべてのログを `combined.log` に書き込みます // (つまり、致命的、エラー、警告、および情報、ただしトレースは除く) // new winston.transports.File({ filename: 'combined.log' }), ],});//// If私たちは運用環境ではないので、形式:// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `//if (process) で`console`にログを記録します。 .env.NODE_ENV !== 'production') { logger.add(newwinston.transports.Console({ format:winston.format.simple(), }));}
require('winston')
によって公開されるデフォルトのロガーを介して直接ログを記録することもできますが、これは、必要に応じてアプリケーション全体で使用できる便利な共有ロガーを意図しているだけです。デフォルトのロガーにはデフォルトではトランスポートがないことに注意してください。トランスポートを自分で追加する必要があり、デフォルトのロガーをトランスポートなしで放置すると、メモリ使用量が高くなる問題が発生する可能性があります。
モチベーション
クイックスタート
使用法
目次
ロギング
ロガーの作成
ストリーム、 objectMode
、およびinfo
オブジェクト
フォーマット
フォーマットの結合
文字列補間
info
オブジェクトのフィルタリング
カスタムフォーマットの作成
ロギングレベル
ログレベルの使用
カスタムログレベルの使用
輸送
同じタイプの複数のトランスポート
カスタムトランスポートの追加
一般的なトランスポート オプション
例外
winston を使用したキャッチされない例外の処理
出るか出ないか
拒否
winston を使用した未検出の Promise 拒否の処理
プロファイリング
ストリーミングログ
ログのクエリ
さらに読む
デフォルトのロガーの使用
winston
にログが書き込まれるのを待っています
winston
で複数のロガーを操作する
コンソールトランスポートメッセージを標準出力と標準エラー出力の代わりにコンソールにルーティングします。
インストール
テストの実行
winston
のログ レベルは、RFC5424 で指定された重大度の順序に準拠しています。つまり、すべてのレベルの重大度は、最も重要なものから最も重要でないものの順に数値的に昇順であると想定されます。
const レベル = { エラー: 0、警告: 1、情報: 2、http: 3、冗長: 4、デバッグ: 5、愚か: 6};
まず、 winston.createLogger
を使用してロガーを作成します。
const logger = winston.createLogger({ トランスポート: [ new winston.transports.Console(), new winston.transports.File({ filename: 'combined.log' }) ]});
ロガーは次のパラメータを受け入れます。
名前 | デフォルト | 説明 |
---|---|---|
level | 'info' | info.level がこのレベル以下の場合にのみログに記録します |
levels | winston.config.npm.levels | ログの優先度を表すレベル (および色) |
format | winston.format.json | info メッセージのフォーマット (「フォーマット」を参照) |
transports | [] (トランスポートなし) | info メッセージのロギングターゲットのセット |
exitOnError | true | false の場合、処理された例外によってprocess.exit 発生しません。 |
silent | false | true の場合、すべてのログが抑制されます |
createLogger
に提供されるレベルは、返されるlogger
の便利なメソッドとして定義されます。
//// ロギング//logger.log({ レベル: '情報', メッセージ: 'こんにちは、分散ログ ファイルです!' });logger.info('また分散ログ');
winston.createLogger
から提供されたlogger
に対してトランスポートを追加または削除できます。
const files = newwinston.transports.File({ filename: 'combined.log' });const console = newwinston.transports.Console();logger .clear() // すべてのトランスポートを削除します .add(console) //コンソールトランスポートを追加します .add(files) // ファイルトランスポートを追加します .remove(console); // コンソールトランスポートを削除します
また、 configure
メソッドを使用して、 winston.Logger
インスタンスを大規模に再構成することもできます。
const logger = winston.createLogger({ レベル: 'info', トランスポート: [ new winston.transports.Console(), new winston.transports.File({ filename: 'combined.log' }) ]});/// / 以前のトランスポートを、// 新しい構成のトランスポートに置き換えます。//const DailyRotateFile = require('winston-daily-rotate-file');logger.configure({ level: 'verbose', Transports: [ new DailyRotateFile(opts) ]});
既存のロガーから子ロガーを作成して、メタデータのオーバーライドを渡すことができます。
const logger = winston.createLogger({ Transports: [ newwinston.transports.Console(), ]});const childLogger = logger.child({ requestId: '451' });
Logger
クラスも拡張している場合、.child
バグが発生する可能性があります。これは、this
キーワードが予期しないものを指すようにする実装の詳細が原因です。慎重に使用してください。
objectMode
、およびinfo
オブジェクトwinston
では、 Logger
とTransport
インスタンスの両方が、 info
オブジェクトを受け入れるobjectMode
ストリームとして扱われます。
特定の形式に提供されるinfo
パラメーターは、単一のログ メッセージを表します。オブジェクト自体は変更可能です。すべてのinfo
は、少なくともlevel
とmessage
プロパティが必要です。
const info = { level: 'info', // ログメッセージのレベル message: 'Hey!何か記録しますか? // 説明的なメッセージが記録されます。};
レベルとメッセージ以外のプロパティは「 meta
」とみなされます。つまり:
const { レベル、メッセージ、...メタ } = 情報;
logform
自体のいくつかの形式では、追加のプロパティが追加されます。
財産 | 追加された形式 | 説明 |
---|---|---|
splat | splat() | %d %s スタイルのメッセージの文字列補間スプラット。 |
timestamp | timestamp() | メッセージが受信されたタイムスタンプ。 |
label | label() | 各メッセージに関連付けられたカスタム ラベル。 |
ms | ms() | 前回のログ メッセージからのミリ秒数。 |
コンシューマーとして、任意のプロパティを追加できます。内部状態はSymbol
プロパティによって維持されます。
Symbol.for('level')
(読み取り専用) : level
プロパティと同じ。すべてのコードで不変として扱われます。
Symbol.for('message'):
「フォーマットの終了」によって設定された完全な文字列メッセージ:
json
logstash
printf
prettyPrint
simple
Symbol.for('splat')
: 追加の文字列補間引数。 splat()
形式によって排他的に使用されます。
これらのシンボルは、 logform
のすべての利用者が同じシンボル参照を持つことができるように、別のパッケージtriple-beam
に保存されます。つまり:
const { LEVEL, MESSAGE, SPLAT } = require('triple-beam');console.log(LEVEL === Symbol.for('level'));// trueconsole.log(MESSAGE === Symbol.for( 'message'));// trueconsole.log(SPLAT === Symbol.for('splat'));// true
注:指定された
meta
オブジェクト内の{ message }
プロパティは、すでに指定されているすべてのmsg
に自動的に連結されます。たとえば、以下の例では、「world」が「hello」に連結されます。logger.log('エラー', 'hello', { メッセージ: '世界' });logger.info('hello', { メッセージ: '世界' });
winston
の形式には、 winston.format
からアクセスできます。これらは、 winston
とは別のモジュールであるlogform
に実装されています。これにより、トランスポートにデフォルトの形式を含めたい場合に、独自のトランスポートを作成するときに柔軟性が得られます。
最新バージョンのnode
テンプレート文字列は非常にパフォーマンスが高く、ほとんどのエンド ユーザーの書式設定を行う場合に推奨される方法です。ログを特注でフォーマットしたい場合は、 winston.format.printf
が最適です。
const { createLogger、フォーマット、トランスポート } = require('winston');const { 結合、タイムスタンプ、ラベル、printf } = フォーマット;const myFormat = printf(({ レベル、メッセージ、ラベル、タイムスタンプ }) => { return ` ${タイムスタンプ} [${ラベル}] ${レベル}: ${メッセージ}`;});const logger = createLogger({ フォーマット:結合(ラベル({ ラベル: '右にゃー!' })、タイムスタンプ()、myFormat )、トランスポート: [new Transports.Console()]});
利用可能な組み込み形式を確認し、独自のカスタム ログ形式の作成の詳細については、 logform
を参照してください。
format.combine
使用すると、任意の数のフォーマットを 1 つのフォーマットに結合できます。 format.combine
opts
をとらないため、便宜上、結合された形式の事前に作成されたインスタンスを返します。
const { createLogger, format, Transports } = require('winston');const { combo, timestamp, label, prettyPrint } = format;const logger = createLogger({ format: combin( label({ label: 'right meow!' } )、timestamp()、prettyPrint() )、トランスポート: [new Transports.Console()]})logger.log({ レベル: '情報'、メッセージ: '何テストの時間は?'});// Outputs:// { level: 'info',// message: 'テストは何時ですか?',// label: 'right meow!',// timestamp : '2017-09-30T03:57:26.875Z' }
log
メソッドは、util.format を使用して文字列補間を提供します。これはformat.splat()
使用して有効にする必要があります。
以下は、 format.splat
使用してメッセージの文字列補間による形式を定義し、 format.simple
を使用してinfo
メッセージ全体をシリアル化する例です。
const { createLogger, format, Transports } = require('winston');const logger = createLogger({ format: format.combine( format.splat(), format.simple() ), Transports: [new Transports.Console() ]});// 情報: テスト メッセージ 私の文字列 {}logger.log('info', 'テスト メッセージ %s', '私の文字列');// 情報: テスト メッセージ 123 {}logger.log('info', 'テスト メッセージ %d', 123);// 情報: テスト メッセージの最初の 2 番目 {number: 123}logger.log('info', 'テスト メッセージ %s, %s' 、「最初」、「2 番目」、{ 数値: 123 });
info
オブジェクトのフィルタリングログ作成時に特定のinfo
オブジェクトを完全に除外したい場合は、単純に falsey 値を返します。
const { createLogger, format, Transports } = require('winston');// ログ メッセージに { private: true }がある場合は無視します constignorePrivate = format((info, opts) => { if (info.private) { return false; } 情報を返します;});const logger = createLogger({ format: format.combine(ignorePrivate(), format.json() ), Transports: [new Transports.Console()]});// 出力: {"level":"error","message":"共有する公開エラー"}logger.log({ レベル: 'エラー', メッセージ: '共有する公開エラーshare'});// logged.logger.log({ private: true, level: 'error', message: 'これは極秘です - 隠してください。'}) の場合、{ private: true } のメッセージは書き込まれません。 ;
format.combine
を使用すると、返される偽の値が尊重され、一連の以降の形式の評価が停止されます。例えば:
const { format } = require('winston');const { combo, timestamp, label } = format;const willNeverThrow = format.combine( format(info => { return false })(), // すべてを無視します format(info => { throw new Error('Never到達') })());
フォーマットは、単一のメソッド、 transform(info, opts)
を定義し、変更されたinfo
を返すプロトタイプ オブジェクト (つまり、クラス インスタンス) です。
info
: ログメッセージを表すオブジェクト。
opts
: フォーマットの現在のインスタンスに固有の設定。
彼らは次の 2 つのうちの 1 つを返すことが期待されています。
変更されたinfo
引数を表すinfo
オブジェクト。不変性が優先される場合は、オブジェクト参照を保持する必要はありません。現在のすべての組み込みフォーマットはinfo
が可変であるとみなしますが、将来のリリースでは [immutablejs] が検討されています。
info
引数が呼び出し元によって無視されるべきであることを示すfalsey 値。 (以下のinfo
オブジェクトのフィルタリング」を参照)。
winston.format
は可能な限りシンプルになるように設計されています。新しいフォーマットを定義するには、単にtransform(info, opts)
関数を渡して新しいFormat
取得します。
返された名前付きFormat
使用して、指定されたFormat
のコピーを必要なだけ作成できます。
const { format } = require('winston');const volume = format((info, opts) => { if (opts.yell) { info.message = info.message.toUpperCase(); } else if (opts. Whisper) { info.message = info.message.toLowerCase(); } return info;});// `volume` は、 format.constcream = volume({ Yell: true });console.dir(scream.transform({ level: 'info', message: `頭の中で叫ばせてしまってごめんなさい!`},cream.options)); // {// レベル: 'info'// メッセージ: '頭の中で怒鳴らせてごめんなさい!'// }// `volume` を複数回使用して、異なるボリュームを作成できます。 formats.const Whisper = volume({ Whisper: true });console.dir(whisper.transform({ level: 'info', message: `なぜ彼らはそんなに怒鳴らせるのですか!`}, Whisper.options)); // {// レベル: '情報'// メッセージ: 'なぜ彼らは私たちをそんなに怒鳴らせるのですか!'// }
winston
のログ レベルは、RFC5424 で指定された重大度の順序に準拠しています。つまり、すべてのレベルの重大度は、最も重要なものから最も重要でないものの順に数値的に昇順であると想定されます。
各level
特定の整数の優先順位が与えられます。優先度が高いほど、メッセージはより重要であるとみなされ、対応する整数の優先度は低くなります。 たとえば、RFC5424 で正確に指定されているように、 syslog
レベルは 0 から 7 (最高から最低) の優先順位が付けられます。
{ 緊急: 0、アラート: 1、クリティカル: 2、エラー: 3、警告: 4、通知: 5、情報: 6、デバッグ: 7}
同様に、 npm
ログ レベルには 0 から 6 (最高から最低) の優先順位が付けられます。
{ エラー: 0、警告: 1、情報: 2、http: 3、詳細: 4、デバッグ: 5、愚か: 6}
winston
が使用するレベルを明示的に定義しない場合は、上記のnpm
レベルが使用されます。
ログ メッセージのレベルの設定は、2 つの方法のいずれかで行うことができます。ロギング レベルを表す文字列を log() メソッドに渡すことも、すべての Winston Logger で定義されているレベル指定のメソッドを使用することもできます。
//// 任意のロガー インスタンス//logger.log('silly', "127.0.0.1 - 我が家に勝る場所はない");logger.log('debug', "127.0.0.1 - 我が家に勝る場所はない") ;logger.log('verbose', "127.0.0.1 - 我が家に勝る場所はありません");logger.log('info', "127.0.0.1 - 故郷に勝る場所はない");logger.log('warn', "127.0.0.1 - 故郷に勝る場所はない");logger.log('error', "127.0.0.1 - 居場所はない自宅のような");logger.info("127.0.0.1 - こんな場所はありませんhome");logger.warn("127.0.0.1 - 故郷に勝る場所はない");logger.error("127.0.0.1 - 故郷に勝る場所はない");//// デフォルトのロガー//winston.log( 'info', "127.0.0.1 - 我が家に勝る場所はありません");winston.info("127.0.0.1 -家に勝る場所はありません」);
winston
使用すると、トランスポートがログに記録するメッセージの最大レベルを指定するlevel
プロパティを各トランスポートに定義できます。たとえば、 syslog
レベルを使用すると、 error
メッセージのみをコンソールに記録し、それ以下のすべてのinfo
ファイル ( error
メッセージを含む) に記録できます。
const logger = winston.createLogger({ レベル:winston.config.syslog.levels, Transports: [ newwinston.transports.Console({ level: 'error' }), new winston.transports.File({ filename: 'combined.ログ'、レベル: '情報' }) ]});
トランスポートのログ レベルを動的に変更することもできます。
const Transports = { コンソール: new winston.transports.Console({ レベル: '警告' })、ファイル: 新しいwinston.transports.File({ ファイル名: 'combined.log'、レベル: 'エラー' })};const logger = winston.createLogger({ Transports: [ Transports.console, Transports.file ]});logger.info('どちらにもログインされませんTransport!');transports.console.level = 'info';transports.file.level = 'info';logger.info('両方のトランスポートに記録されます!');
winston
カスタマイズ可能なログ レベルをサポートしており、デフォルトでは npm スタイルのログ レベルになります。ロガーの作成時にレベルを指定する必要があります。
winston
で使用できる事前定義されたnpm
、 syslog
、およびcli
レベルに加えて、独自の定義を選択することもできます。
const myCustomLevels = { レベル: { foo: 0, bar: 1, baz: 2, foobar: 3 }, 色: { foo: '青'、bar: '緑'、baz: '黄'、foobar: '赤' }};const customLevelLogger = winston.createLogger({ レベル: myCustomLevels.levels});customLevelLogger.foobar('foobar のレベル付きメッセージ');
このデータ構造にはわずかな繰り返しがありますが、色を使用したくない場合は、単純なカプセル化が可能になります。色を使用したい場合は、ロガー自体にレベルを渡すだけでなく、winston に色を認識させる必要があります。
winston.addColors(myCustomLevels.colors);
これにより、ロガーはcolorize
フォーマッタを使用して、カスタム レベルの出力を適切に色付けし、スタイル設定できるようになります。
さらに、背景色やフォント スタイルを変更することもできます。例えば、
baz: 'イタリックイエロー'、foobar: '太字レッドシアンBG'
可能なオプションは以下のとおりです。
フォント スタイル: bold
、 dim
、 italic
、 underline
、 inverse
、 hidden
、 strikethrough
。
フォントの前景色: black
、 red
、 green
、 yellow
、 blue
、 magenta
、 cyan
、 white
、 gray
、 grey
。
背景色: blackBG
、 redBG
、 greenBG
、 yellowBG
、 blueBG
magentaBG
、 cyanBG
、 whiteBG
標準ログレベルを色分けするには、次を追加します
winston.format.combine(winston.format.colorize()、winston.format.simple());
ここで、 winston.format.simple()
は、使用したい他のフォーマッタです。 colorize
フォーマッタは、色を付けるテキストを追加するフォーマッタよりも前に配置する必要があります。
json フォーマッタを使用してログ行全体を色付けするには、次を適用できます。
winston.format.combine(winston.format.json(), Winston.format.colorize({ all: true }));
winston
にはいくつかのコア トランスポートが含まれており、Node.js コアによって提供される組み込みネットワークとファイル I/O を利用します。さらに、コミュニティのメンバーによって作成された追加のトランスポートもあります。
トランスポートを構築するときに、同じタイプの複数のトランスポート ( winston.transports.File
など) を使用することができます。
const logger = winston.createLogger({ Transports: [ new winston.transports.File({ filename: 'combined.log', level: 'info' }), new winston.transports.File({ filename: 'errors.log' 、レベル: 'エラー' }) ]});
後でこれらのトランスポートの 1 つを削除したい場合は、トランスポート自体を使用して削除できます。例えば:
const generatedLogs = logger.transports.find(transport => { return Transport.filename === 'combined.log'});logger.remove(combinedLogs);
カスタム トランスポートの追加は簡単です。必要なのは、必要なオプションを受け入れ、 log() メソッドを実装し、 winston
でそれを使用することだけです。
const Transport = require('winston-transport');const util = require('util');//// `winston-transport` から継承して、// 基本機能と `.Exceptions.handle を利用できるようにします()`.//module.exports = class YourCustomTransport extends Transport {constructor(opts) {super(opts); // // ここでカスタム オプションを使用します。例: // - データベースの接続情報 // - API の認証情報 (loggly、papertrail、// logentries など)。 // } log(info, callback) { setImmediate(() => { this.emit('logged', info); }); // リモート サービスへの書き込みを実行します callback(); }};
すべてのトランスポートは winston-transport から継承しているため、各トランスポートでカスタム形式とカスタム ログ レベルを個別に設定できます。
const logger = winston.createLogger({ Transports: [ new winston.transports.File({ filename: 'error.log', level: 'error', format:winston.format.json() }), new winston.transports. Http({ レベル: '警告', 形式: winston.format.json() })、新しい winston.transports.Console({ レベル: '情報',形式:winston.format.combine(winston.format.colorize(), winston.format.simple() ) }) ]});
winston
使用すると、プロセスからuncaughtException
イベントをキャッチしてログに記録することができます。独自のロガー インスタンスを使用すると、作成時またはアプリケーション ライフサイクルの後半でこの動作を有効にすることができます。
const { createLogger, Transports } = require('winston');// logger の作成時に例外処理を有効にします。const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] 、ExceptionHandlers: [ new Transports.File({ filename: '例外.log' }) ]});// または、トランスポートを追加するか、次を使用して後で有効にします`.Exceptions.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// トランスポートを使用して例外を呼び出して、例外を処理しますlogger.Exceptions.handle ( 新しい Transports.File({ ファイル名: '例外.ログ' }));
この機能をデフォルトのロガーで使用する場合は、トランスポート インスタンスを使用して.exceptions.handle()
を呼び出すだけです。
//// `.Exceptions.handle` に渡すことで別の例外ロガーを追加できます。 //winston.Exceptions.handle( newwinston.transports.File({ filename: 'path/to/Exceptions.log' }) );//// または、winston.//winston.add(newwinston.transports.File({ filename: 'パス/to/combined.log'、handleExceptions: true}));
デフォルトでは、winston は uncaughtException をログに記録した後に終了します。これが希望する動作ではない場合は、 exitOnError = false
に設定してください。
const logger =winston.createLogger({ exitOnError: false });//// または、次のように://logger.exitOnError = false;
カスタム ロガー インスタンスを操作する場合、別のトランスポートを例外exceptionHandlers
プロパティに渡すか、任意のトランスポートにhandleExceptions
設定できます。
const logger = winston.createLogger({ トランスポート: [ newwinston.transports.File({ filename: 'path/to/combined.log' }) ],ExceptionHandlers: [ newwinston.transports.File({ filename: 'path/ to/Exceptions.log' }) ]});
const logger = winston.createLogger({ Transports: [ newwinston.transports.Console({ handleExceptions: true }) ], exitOnError: false});
exitOnError
オプションは、特定のタイプのエラーのみで終了しないようにする関数としても使用できます。
functionignoreEpipe(err) { return err.code !== 'EPIPE';}const logger =winston.createLogger({ exitOnError:ignoreEpipe });//// または、次のようになります:://logger.exitOnError =ignoreEpipe;
winston
を使用すると、プロセスからunhandledRejection
イベントをキャッチしてログに記録することができます。独自のロガー インスタンスを使用すると、作成時またはアプリケーション ライフサイクルの後半でこの動作を有効にすることができます。
const { createLogger, Transports } = require('winston');// logger.const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] の作成時に拒否処理を有効にします。 、rejectionHandlers: [ new Transports.File({ filename: 'rejections.log' }) ]});// または、トランスポートを追加して後で有効にするか、 using `.rejections.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// トランスポートを使用して、rejections.handle を呼び出して、rejectionslogger.rejections を処理します。 handle( new Transports.File({ filename: 'rejections.log' }));
この機能をデフォルトのロガーで使用したい場合は、トランスポート インスタンスを使用して.rejections.handle()
を呼び出すだけです。
//// `.rejections.handle` に渡すことで別の拒否ロガーを追加できます。//winston.rejections.handle( newwinston.transports.File({ filename: 'path/to/rejections.log' }) );//// あるいは、winston に // トランスポートを追加するときに `handleRejections` を true に設定することもできます。//winston.add(new winston.transports.File({ filename: 'path/to/combined.log', handleRejections: true}));
メッセージとメタデータのログに加えて、 winston
は、あらゆるロガー向けに実装された単純なプロファイリング メカニズムもあります。
//// 'test' のプロファイルを開始します//logger.profile('test');setTimeout(function () { // // 'test' のプロファイルを停止します。ログが作成されます: // '17 Jan 21 :00:00 - 情報: テスト期間=1000ms' // logger.profile('test');}, 1000);
また、タイマーを開始して、 .done()
を呼び出すことができる参照を保持することもできます。
// 特定のタイミングに対応するオブジェクトを返します。 Done // が呼び出されると、タイマーが終了し、継続時間を記録します。例: // const profiler = logger.startTimer(); setTimeout(function () { profiler.done({ message: 'ログメッセージ' }); }, 1000);
すべてのプロファイル メッセージはデフォルトで「情報」レベルに設定されており、メッセージとメタデータは両方ともオプションです。 個々のプロファイル メッセージについては、メタデータ オブジェクトにlevel
プロパティを指定することで、デフォルトのログ レベルをオーバーライドできます。
logger.profile('テスト', { レベル: 'デバッグ' });
winston
Loggly のようなオプションを使用したログのクエリをサポートしています。 「Loggly 検索 API」を参照してください。具体的には、 File
、 Couchdb
、 Redis
、 Loggly
、 Nssocket
、およびHttp
。
const options = { from: new Date() - (24 * 60 * 60 * 1000)、until: new Date()、制限: 10、開始: 0、順序: 'desc'、フィールド: ['message']} ;//// 今日から昨日までに記録されたアイテムを検索します。//logger.query(options, function (err, results) { if (err) { /* TODO: 処理してください */ throwエラー; } console.log(結果);});
ストリーミングを使用すると、選択したトランスポートからログをストリーミングして戻すことができます。
//// 最後から開始します。//winston.stream({ start: -1 }).on('log', function(log) { console.log(log);});
デフォルトのロガーには、 winston
モジュールを通じて直接アクセスできます。ロガーのインスタンスで呼び出すことができるメソッドはすべて、デフォルトのロガーで使用できます。
const winston = require('winston');winston.log('info', 'こんにちは分散ログ ファイル!');winston.info('また分散ログ');winston.level = 'debug';winston.log ('debug', 'デバッグ メッセージがコンソールに書き込まれました!');
デフォルトでは、デフォルト ロガーにトランスポートは設定されていません。トランスポートを追加または削除するには、 add()
メソッドとremove()
メソッドを使用する必要があります。
const files = new winston.transports.File({ filename: 'combined.log' });const console = new winston.transports.Console();winston.add(console);winston.add(files);winston.remove (コンソール);
または、configure() を 1 回呼び出して実行します。
winston.configure({ トランスポート: [ new winston.transports.File({ ファイル名: 'somefile.log' }) ]});
winston
でサポートされている個々のトランスポートの操作に関する詳細なドキュメントについては、 winston
トランスポートのドキュメントを参照してください。
winston
にログが書き込まれるのを待っています多くの場合、プロセスを終了する前に、ログが書き込まれるのを待つと便利です。 winston.Logger
の各インスタンスは [Node.js ストリーム] でもあります。ストリームが終了した後、すべてのログがすべてのトランスポートにフラッシュされると、 finish
イベントが発生します。
const Transport = newwinston.transports.Console();const logger =winston.createLogger({transports: [transport]});logger.on('finish', function (info) { // すべての `info` ログ メッセージにはログに記録されました});logger.info('CHILL WINSTON!', { 真剣に: true });logger.end();
ロガー自体内でエラーが発生した場合、ロガーは「エラー」イベントも発行することにも言及する価値があります。未処理の例外が発生したくない場合は、このイベントを処理するか抑制する必要があります。
//// ロガー自体に起因するエラーを処理する//logger.on('error', function (err) { /* Do Something */ });
多くの場合、大規模で複雑なアプリケーションでは、異なる設定を持つ複数のロガー インスタンスが必要になります。各ロガーは、異なる機能領域 (またはカテゴリ) を担当します。これは、 winston.loggers
とwinston.Container
のインスタンスという 2 つの方法でwinston
に公開されます。実際、 winston.loggers
、 winston.Container
の事前定義されたインスタンスにすぎません。
const winston = require('winston');const { format } = winston;const { combine, label, json } = format;//// `category1` のロガーを設定する //winston.loggers.add('category1' , { 形式: combin( label({ label: 'カテゴリ 1' }), json() )、transports: [ newwinston.transports.Console({ level: '愚か' }), new winston.transports.File({ filename: 'somefile.log' }) ]});//// `category2` のロガーを設定します//winston.loggers.add('category2', { 形式: combin( label({ label: 'カテゴリ 2' }), json() )、transports: [ newwinston.transports.Http({ host: 'localhost'、ポート:8080 }) ]});
これでロガーがセットアップされたので、アプリケーション内の任意のファイルでwinston を要求し、これらの事前構成されたロガーにアクセスできます。
const winston = require('winston');//// 事前設定されたロガーを取得します//const category1 =winston.loggers.get('category1');const category2 =winston.loggers.get('category2');category1。 info('ファイルおよびコンソール トランスポートへのログ記録');category2.info('http トランスポートへのログ記録');
Container
自分で管理したい場合は、単純にインスタンスを作成できます。
const winston = require('winston');const { format } = winston;const {結合、ラベル、json } = format;const コンテナ = newwinston.Container();container.add('category1', { format:結合( label({ label: 'category one' }), json() )、transports: [ newwinston.transports.Console({ level: 'silly' }), new winston.transports.File({ filename: 'somefile.log' }) ]});const category1 =container.get('category1');category1.info('ファイルおよびコンソールトランスポートへのログ記録');
デフォルトでは、 winston.transports.Console
トランスポートはメッセージをstdout
およびstderr
に送信します。ほとんどの状況ではこれで問題ありません。ただし、これが望ましくない場合もあります。次のような場合があります。
VSCode を使用し、Node.js プロセスを起動するのではなく接続してデバッグする
AWS Lambda での JSON 形式のメッセージの書き込み
--silent
オプションを使用した Jest テスト中のログ記録
トランスポート ログにconsole.log()
、 console.warn()
、およびconsole.error()
を代わりに使用させるには、 forceConsole
オプションをtrue
に設定します。
const logger = winston.createLogger({ レベル: 'info', トランスポート: [newwinston.transports.Console({ ForceConsole: true })]});
npm インストール ウィンストン
糸追加ウィンストン
winston テストはすべて、 mocha
、 nyc
、およびassume
を使用して作成されます。 これらはnpm
で実行できます。
npmテスト