このブログでは、ログ ライブラリを利用することの価値について説明し、Node.js 用に見つけた、最も評価の高い 10 個のログ ツールを紹介します。 @playerzero では、node.js ロギング ライブラリを頻繁に使用して、ログ イベントを作成および管理しています。現在、フロントエンド アプリケーションとバックエンド アプリケーションの両方にとって重要なことを監視する独自のアプローチをどのように導入しているかについて詳しくは、https://www.playerzero.app/ をご覧ください。
ピノ
ウィンストン
バニヤン
モーガン
ログレベル
Log4js
Npmlog
轟音
トレーサー
シグナル
大まかな観点から見ると、Node.js ロギングは、開発者がアプリケーションのイベントとパフォーマンスを追跡し、問題を診断して修正し、システムの動作を監視し、十分な情報に基づいて意思決定を行うのに役立つため、重要です。ロギングはアプリケーションのアクティビティの記録を提供するため、開発者は問題を特定してデバッグし、ユーザーの行動を理解し、システムの全体的なパフォーマンスと安定性を向上させることができます。ロギングは、エラーの検出と修正、システム パフォーマンスの監視、およびセキュリティ インシデントの検出のために、運用環境でも役立ちます。
アプリケーションで何か問題が発生した場合、開発者はスタック トレースを介してそのソースを追跡することができます。しかし… スタック トレースだけに頼っていても、全体像は半分しかわかりません。トレースは、リクエストのフロー、データベース クエリ、外部 API 呼び出し、パフォーマンス メトリックなど、アプリケーションの実行に関する情報を提供します。これは非常に便利です。一般に、トレースは、アプリケーションの動作を詳細なレベルで理解し、パフォーマンスのボトルネックを特定するために使用されます。
ロギングは、全体像の残りの半分を埋めます。ロギングは、エラー、警告、パフォーマンス メトリック、デバッグ情報など、アプリケーションに関連するメッセージとイベントを記録するプロセスです。 Node.js でのログ記録は、問題の診断、ユーザーの行動の理解、およびアプリケーションの全体的なパフォーマンスと安定性の向上に使用されます。また、アプリケーション内のアクティビティの記録も提供されるため、開発者は問題を特定してデバッグし、より多くの情報に基づいて決定を下すことができます。
Node.js ロギング ライブラリを使用する必要がある理由はいくつかあります。
ログ レベルは、ログ メッセージの重要性または重大度を分類する方法です。通常、重大なエラーから情報メッセージまで、いくつかのレベルがあり、各レベルは、ライブラリ内のログ メッセージのフィルタリングに使用できる数値に関連付けられています。最も一般的なレベルは次のとおりです。
FATAL
ログ レベル
当然のことながら、 FATAL
ログ レベルは、アプリケーションの重大なエラーを示す重大度のレベルです。つまり、 FATAL
レベルのログは、開発者の介入なしではアプリケーションを正常に実行し続けることができないことを示します。
ERROR
ログ レベル
ERROR
ログ レベルは、アプリケーションが現在実行可能であることを示しますが、問題が発生しています。通常、これは、アプリケーションで必要なタスクが失敗したこと、つまり、例外、予期しない動作、または不適切な入力があったことを示します。
WARN
ログレベル
WARN
ERROR
よりも重大度の低いログ レベルですが、それでも無視すべきではありません。 WARN
ログは、アプリケーション内の何かがより重大な問題の触媒になる可能性があることを示しているため、問題を事前に特定し、問題が深刻化するのを防ぐために使用できます。
INFO
ログレベル
INFO
ログ レベルは、ロギング システムで一般的な情報メッセージを示すために使用されるログ メッセージのタイプです。通常、プロセスの開始、タスクの完了、またはシステムの状態の変化など、アプリケーションまたはシステムで予想される定期的なイベントをログに記録するために使用されます。これらのアラートは、アプリケーションが正常に動作していることを確認するためのものであるため、通常は無視できます。
DEBUG
ログ レベル
通常、 DEBUG
ログ レベルは、デバッグ プロセス内でのみ役立つ情報を提供します。 DEBUG
ログは、最も詳細なタイプのログ メッセージであり、アプリケーションの内部動作の詳細なビューを提供します。 DEBUG
ログの主な目的は、開発者がシステムの動作を理解し、バグや問題を特定し、問題を診断できるようにすることです。
Pino は、10.9K 以上の Github スターと npm での数百万回のダウンロードを誇る、老舗の非常に人気のあるロギング ツールです。 Pino は、Node.js アプリケーションでの使用に適したいくつかの重要な機能を提供するため、Node.js の一般的なロギング ライブラリです。
高速- Pino は、パフォーマンスに重点を置いて、高速かつ軽量になるように設計されています。ログ メッセージにバイナリ形式を使用するため、ログ出力を迅速かつ効率的に生成できます。
構造化ログ- Pino はメッセージを JSON 形式でログに記録します。これにより、ログ データの解析、フィルタリング、および分析が容易になります。これにより、ログ データの検索、視覚化、分析、およびログ データの他のシステムへの統合が容易になります。
拡張が簡単- Pino は高度に拡張できるように設計されており、ログ データをファイルに書き込んだり、ログ データをリモート サーバーに送信したりするなどの追加機能を追加するために使用できる組み込みプラグインが多数含まれています。
低オーバーヘッド- Pino は、リソースの使用が最小限であるため、非常に効率的な Node.js ロギング ライブラリです。 Pino を使用したロギング プロセスは、メッセージを徐々に蓄積し、アプリケーションのスロットリングと 1 秒あたりのリクエスト数の減少につながります。スロットリングは、イベントが複数回発生した場合でも、イベントに接続された関数が指定された時間枠内で 1 回だけ実行されるようにトリガーされる手法です。
トランスポート- Pino は、ファイルへの書き込み、コンソールでの表示、Sentry、Azure Application Insights、CouchDB などのプラットフォームの利用など、ログを送信するためのさまざまなオプションを提供します。
Node.js アプリケーションで Pino を使用するには、次の手順に従います。
Pino をインストールするには、新しいディレクトリで次のコマンドを実行してインストールします。
npm install pino
インポート- Node.js アプリケーションで、ファイルの先頭に次のコード行を追加して Pino をインポートします。
const pino = require('pino');
初期化- ロガー インスタンスを作成して Pino を初期化します。次に例を示します。
const logger = pino({ level: 'info' });
このスクリプトは、コンソールにINFO
以上のロギング レベルのログを生成します。
レベルを info に設定すると、Pino はINFO
、 WARN
、 ERROR
、およびFATAL
のログ レベルでメッセージをログに記録します。 DEBUG
など、ロギング レベルがINFO
未満のメッセージはログに記録されません。
このコードは、ログ レベルが INFO に設定された Pino ロガー インスタンスのみを作成します。ロガー インスタンスを使用して何かをログに記録するまで、ログ メッセージは生成または表示されません。例えば:
logger.info('This is an info message');
これにより、コンソールに次の出力が生成されます。
{"level":30,"time":1624825088703,"msg":"This is an info message","pid":1234,"hostname":"my-machine"}
コンソールに表示されるログ データには、ログ レベル、記録されたときのタイムスタンプ、ログに記録されているメッセージ、ログの識別子、およびホスト名が含まれます。
ロギング- logger
インスタンスを使用して、アプリケーション内の他のメッセージをログに記録することもできます。例えば:
logger.warn('This is a warning message'); logger.error('This is an error message');
出力- デフォルトでは、Pino はコンソールにログを記録します。出力を変更する場合は、ファイルへの書き込み、Sentry などのリモート サービスへのログの送信、Azure Application Insights の使用など、前述の Pino の利用可能なトランスポートのいずれかを使用できます。詳細については、Pino の「既知のトランスポート」セクションを参照してください。
Pino のpino-pretty
基本 NDJSON フォーマッター機能は、Pino ログ用の優れたシンプルなフォーマッターであり、セットアップも簡単です。起動して実行する方法は次のとおりです。
ステップ 1 - ターミナルで次のコマンドを実行して、Node.js プロジェクトに pino-pretty を依存関係としてインストールします。
npm install pino-pretty
ステップ 2 - ファイルの先頭に次のコード行を追加して、Node.js アプリケーションにpino-pretty
インポートします。
const pino = require('pino'); const pinoPretty = require('pino-pretty'); const logger = pino({ level: 'info' }); logger.pipe(pinoPretty());
これら 2 つのコード スニペットを使用して、 pino-pretty
インストールし、Pino ログをフォーマットするように設定しました。これで、ロガー インスタンスを使用してアプリケーションでメッセージをログに記録できるようになりました。ログは、人間が判読できるきれいな形式でコンソールに表示されます。
How to Debug Node.js with the Best Tools Available by @RisingStackで、Pino を使用したデバッグの詳細をご覧ください。
GitHub で 20,000 を超えるスターを獲得した Winston は、Node.js の非常に人気のあるログ ライブラリです。 Winston は、その包括的な機能セットと使いやすさから、Node.js エコシステムにおける独自のロギング ライブラリです。ウィンストンが際立っている理由のいくつかは次のとおりです。
Node.js プロジェクトに Winston をインストールするには、端末で次のコマンドを実行して npm パッケージ マネージャーを使用できます。
npm install winston
インストールが完了したら、次の行を含めることで、Winston を Node.js コードにインポートして使用できます。
const winston = require('winston');
次に、Winston ライブラリを使用して、ロギング インスタンスを構成および作成できます。次に例を示します。
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.Console() ] });
これにより、情報レベルとコンソール トランスポートを使用してロガー インスタンスが作成されます。このロガー インスタンスを使用して、アプリケーションでメッセージをログに記録できます。次に例を示します。
logger.info('Hello World');
これにより、メッセージHello World
情報ログ レベルでコンソールに記録されます。
Winston には、RFC5424 ドキュメントで概説されているガイドラインに従って配置された 6 つのデフォルトのログ レベルが装備されています。レベルには数値の優先順位が割り当てられ、最も重大度が低い番号が割り当てられます。 6 つのレベルとそれぞれの優先順位の値は次のとおりです。
{ error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 }
6 つのログ レベルのそれぞれについて、ロガー オブジェクトに対応するメソッドがあります。
logger.error('error'); logger.warn('warn'); logger.info('info'); logger.verbose('verbose'); logger.debug('debug'); logger.silly('silly');
ログ レベルを表す文字列を log() メソッドに渡すこともできます。
logger.log('error', 'error message'); logger.log('info', 'info message');
logger
のlevel
プロパティは、構成したトランスポートに渡されるログ メッセージを指定します。たとえば、 level
プロパティがinfo
に設定されている場合、重大度がinfo
以上のログ エントリのみが書き込まれ、その他すべてのエントリの優先度が低くなります。これは、現在の構成では、 info
、 warn
、およびerror
のレベルのログ メッセージのみが出力されることを意味します。
Bunyan は、ログ データをより構造化して読みやすくすることに重点を置いているため、Node.js のユニークなログ ライブラリです (ログをプレーン テキストではなく JSON オブジェクトとしてシリアル化することでこれを実現しています)。 Bunyan が Github で 7,000 スターを獲得した理由は次のとおりです。
Bunyan をインストールするには、ターミナルまたはコマンド プロンプトで次のコマンドを実行します。
npm install bunyan
これにより、Bunyan ライブラリとその依存関係が Node.js プロジェクトにインストールされます。インストールしたら、コードでライブラリを要求して使用を開始できます。
Bunyan をプロジェクトにインポートします。JavaScript ファイルの先頭に、次の行を追加します。
const bunyan = require('bunyan');
ロガー インスタンスを作成する- 次に、次のコードを使用してロガー インスタンスを作成します。
const logger = bunyan.createLogger({ name: 'my-app-name', level: 'info' });
この例では、 name
はアプリケーションの名前であり、level は表示するログの最小レベルを指定します。
メッセージをログに記録する- メッセージをログに記録するには、info、warn、error などの Bunyan のログ メソッドのいずれかを呼び出し、ログに記録するメッセージを次のように渡します。
logger.info('This is an info log message'); logger.warn('This is a warn log message'); logger.error('This is an error log message');
コードを実行します。最後に、コードを実行すると、ログに記録されたメッセージがコンソールに表示されます。
デフォルトでは、Bunyan は JSON 形式でログを出力するため、ログ管理ツールを使用してログを簡単に解析および分析できます。 Bunyan のストリーム オプションを使用してフォーマットをカスタマイズすることもできます。
Morgan は、主にミドルウェアとしての独自の位置付けなど、いくつかの理由から Node.js の独自のロギング ライブラリです。これは他の理由の中でも非常に人気があり、この記事の執筆時点で GitHub には 7.3K のスターがありました。モーガンが人気の理由は次のとおりです。
npm を使用して morgan パッケージをインストールすることから始めます。
npm install morgan
インストール プロセスが完了したら、"require" 関数を使用してライブラリをインポートし、それをミドルウェアとして Express.js アプリケーションに統合する必要があります。
このコードは次のようになります。
var morgan = require('morgan'); app.use(morgan('dev'));
「dev」引数は、Morgan が提供するフォーマット オプションです。 Morgan は、次の 5 つの異なるログ形式を提供しています。
tiny
出力はごくわずかです。short
には応答時間が含まれ、デフォルトでログが省略されます。dev
開発中に使用するための簡潔で色分けされた出力を提供しますcommon
は、Apache 結合ログ出力も使用します。combined
標準化された Apache 結合ログ出力を利用します。
以下に示すように、Morgan をアプリケーションに統合するときに適切な引数を使用して、これらの形式から選択できます。
app.use(morgan('combined')); app.use(morgan('common')); app.use(morgan('dev')); app.use(morgan('short')); app.use(morgan('tiny'));
Loglevel は、Github で 2.4K のスターがあり、ここにリストされている他のオプションのいくつかよりも少し人気がありませんが、それでも優れた軽量のログ ライブラリです。 loglevel が Node.js の独自のロギング ライブラリである理由をいくつか次に示します。
ログレベルを設定するには、最初に npm を使用してインストールする必要があります。
npm install loglevel
インストールしたら、Node.js プロジェクトにインポートし、ログ レベルを設定して使用を開始できます。
const log = require('loglevel'); log.setLevel(log.levels.ERROR);
ログ レベルをERROR,
重大度レベルがERROR
のログ メッセージのみがログに記録されるように指定されます。ログ レベルを設定したら、次の方法を使用して、さまざまなレベルでメッセージをログに記録できます。
log.trace('This is a trace message'); log.debug('This is a debug message'); log.info('This is an info message'); log.warn('This is a warning message'); log.error('This is an error message');
設定したログ レベルによって、ログに記録されるメッセージと無視されるメッセージが決まります。たとえば、ログ レベルが info に設定されている場合、 log.infoおよび log.warn または log.error を使用してログに記録されたメッセージのみが表示されます。
もちろん、兄弟である Log4js を挙げずに loglevel について言及することはできません。 Log4js は、人気のある Java ロギング ライブラリ Log4j のポートとして開始された JavaScript ロギング ライブラリです。 JavaScript アプリケーションに同様のログ ソリューションを提供するために作成され、その後、高度なログ機能と機能を提供するように進化しました。 Github で 5.6k を超えるスターがあり、Log4js が非常に人気がある理由のいくつかを以下に示します。
Log4js をインストールするには、端末で次のコマンドを実行して npm パッケージ マネージャーを使用できます。
npm install log4js
これにより、最新バージョンの Log4js とその依存関係がインストールされます。次に、Node.js アプリケーションでライブラリを要求し、それを使用してメッセージをログに記録できます。
Log4js の使用を開始するには、まずコードでそれを必要とし、構成します。
const log4js = require('log4js'); log4js.configure({ appenders: { console: { type: 'console' } }, categories: { default: { appenders: ['console'], level: 'info' } } }); const logger = log4js.getLogger();
その後、ロガーを使用して、さまざまなレベルでメッセージをログに記録できます。
logger.trace('Entering cheese testing'); logger.debug('Got cheese.'); logger.info('Cheese is Gouda.'); logger.warn('Cheese is quite smelly.'); logger.error('Cheese is too ripe!'); logger.fatal('Cheese was breeding ground for listeria.');
Log4js を使用して、異なるログ レベルで複数のアペンダー (コンソールとファイル) にメッセージを記録する例を次に示します。
const log4js = require('log4js'); log4js.configure({ appenders: { console: { type: 'console' }, file: { type: 'file', filename: 'app.log' } }, categories: { default: { appenders: ['console'], level: 'info' }, file: { appenders: ['file'], level: 'error' } } }); const logger = log4js.getLogger(); const fileLogger = log4js.getLogger('file'); logger.info('This is an informational message'); fileLogger.error('This is an error message');
この例では、カテゴリ「デフォルト」のロガーは、レベル情報以上のメッセージをコンソールに記録するように構成されています。カテゴリが「ファイル」のロガーは、エラーレベル以上のメッセージをファイルに記録するように構成されています。 2 つのロガーは、メッセージをそれぞれのアペンダーに記録するために、同じ意味で使用できます。
npmlog の独自の価値は、そのシンプルさと最小限のオーバーヘッドにあり、小規模またはパフォーマンス重視のプロジェクトでの使用に適しています。構成が簡単で、npm エコシステムとシームレスに統合できるため (npm の公式ロガー ユーティリティであるため驚くことではありません)、軽量のログ ソリューションを探している開発者に人気があります。 npmlog がリストを作成した理由は次のとおりです。
npmlog をインストールするには、マシンに Node.js と npm (Node Package Manager) がインストールされている必要があります。その後、ターミナルまたはコマンド プロンプトで次のコマンドを実行できます。
npm install npmlog
これにより、最新バージョンの npmlog とその依存関係がダウンロードされてインストールされ、Node.js プロジェクトで使用できるようになります。
Node.js プロジェクトで npmlog を使用する方法の例を次に示します。
const log = require('npmlog'); log.level = 'verbose'; log.verbose('This is a verbose message'); log.info('This is an informational message'); log.warn('This is a warning'); log.error('This is an error');
この例では、 npmlog
モジュールを要求し、それを変数に割り当てることから始めます。次に、ログ レベルをverbose
に設定します。これは、ログ レベルがverbose
、 info
、 warn
、およびerror
のメッセージが表示されることを意味します。次に、 verbose
、 info
、 warn
、およびerror
メソッドを使用して、さまざまなレベルでメッセージをログに記録します。
デフォルトでは、npmlog はprocess.stderr
に書き込みます。 process.stdout
に書き込む必要がある場合は、 log.stream
プロパティを使用できます。
roarr ライブラリは、初期化を必要とせずに構造化データを生成するように設計された Node.js ロギング ツールです。コマンドライン インターフェイス (CLI) を備えており、環境変数をサポートしているため、用途が広く使いやすいです。さらに、roarr は Node.js とブラウザー環境の両方と互換性があるため、幅広いアプリケーションに対応する多用途のログ ソリューションになります。
以下に、roarr ライブラリの独自の価値を際立たせる重要なポイントをいくつか示します。
まず、npm を使用して roarr をインストールします。
npm install roarr
次に、roarr をコードにインポートしてロガーを作成します。
const Roarr = require('roarr').default; const logger = new Roarr({ context: { service: 'my-service' } });
log
メソッドを使用してメッセージをログに記録します。
logger.info('Hello, world!');
デフォルトでは、roarr ログはコンソールに出力されます。 stream
オプションを使用して、ファイルなどの別のストリームを指定することで、ログ出力をカスタマイズできます。
const Roarr = require('roarr').default; const fs = require('fs'); const logger = new Roarr({ context: { service: 'my-service' }, stream: fs.createWriteStream('./my-service.log') });
これは、roarr の使用方法の基本的な例にすぎません。利用可能なオプションや機能は他にもたくさんあります。詳細については、roarr の公式ドキュメントを参照してください。
Tracer は、Node.js コミュニティによって開発された、Node.js アプリケーション用のオープンソース ロギング ライブラリです。 Node.js アプリケーションでメッセージとデバッグ情報を記録するための効率的かつ柔軟な方法を提供するように設計されています。 Tracer は、ボランティアのチームによって積極的に維持および開発されており、Github で誰でも使用および貢献できます。これを独自のログ ライブラリにする機能の一部を次に示します。
Tracer は Node Package Manager (npm) を使用してインストールできます。トレーサーをインストールする手順は次のとおりです。
npm install tracer
これにより、プロジェクトに依存関係として Tracer がインストールされます。その後、コードでそれを要求し、それを使用してメッセージをログに記録することができます。
コードで Tracer を使用する方法の例を次に示します。
const tracer = require('tracer'); const logger = tracer.console(); logger.info('Starting the application...');
この例では、最初に Tracer ライブラリを必要とし、次にtracer.console()
メソッドを使用してコンソール ロガーを作成します。最後に、ロガー オブジェクトのinfo
メソッドを使用して、情報メッセージをログに記録します。
Tracer を使用する別の例を次に示します。
const tracer = require('tracer'); const logger = tracer.dailyfile({root: './logs', maxLogFiles: 10}); logger.error('An error has occurred:', new Error('Something went wrong'));
この例では、 tracer.dailyfile
メソッドを使用して、日ごとのローテーション ファイルにログを書き込むファイル ロガーを作成しています。 root
オプションはログ ファイルが保存されるディレクトリを指定し、 maxLogFiles
オプションは保持されるログ ファイルの数を制限します。
最後に、ロガー オブジェクトのerror
メソッドを使用してエラー メッセージをエラー オブジェクトと共にログに記録し、発生したエラーに関する詳細情報を提供します。
その Github ページは、「ハッキング可能で、コアまで構成可能」であることを誇っています。これが、Signale が Node.js コミュニティでこれほど愛されているロギング ライブラリである理由の主要な部分です。このライブラリは、Node.js アプリケーションでメッセージをログに記録しようとするときに開発者が直面する問題 (ログが雑然として読みにくいなど) の解決策として作成されました。パックから際立っている理由は次のとおりです。
Signale をインストールするには、ターミナルで次のコマンドを実行して、Node.js パッケージ マネージャーである npm を使用できます。
npm install signale
または、端末で次のコマンドを実行して、yarn を使用して Signale をインストールすることもできます。
yarn add signale
インストールしたら、Signale を Node.js アプリケーションにインポートし、それを使用してメッセージとデバッグ情報をログに記録できます。
Signale を Node.js アプリケーションにインポートし、それを使用してメッセージをログに記録する例を次に示します。
const signale = require('signale'); // Log an info message signale.info('Starting up the server'); // Log a success message signale.success('Server started successfully'); // Log a warning message signale.warn('Low memory warning'); // Log an error message signale.error(new Error('An error occurred while processing data'));
この例では、 require
関数を使用して Signale を Node.js アプリケーションにインポートします。次に、Signale が提供するinfo
、 success
、 warn
、 error
のさまざまなログ メソッドを使用して、さまざまな種類のメッセージをログに記録します。これらの方法にはそれぞれ特徴的な記号と色があり、ログ メッセージの種類を簡単に識別できます。
追加のロギング方法やカスタマイズ オプションなど、Signale の使用方法の詳細については、 Signale のドキュメント を参照してください。
Node.js アプリケーションをデバッグするための迅速で効率的な方法をお探しですか?この記事で言及されている 1 つまたは複数のライブラリを確認してください。それぞれが優れたオプションです。ただし、Pino は、その価値があるため、私たちの個人的なログ ライブラリを選択しています 😉
これらのログ ライブラリは、テスト/開発環境と本番環境の両方で Node.js アプリケーションをデバッグする際に重要であることが証明されています。
さらに、それらを PlayerZero のような監視ソリューションと統合することで、Node.js アプリケーションのパフォーマンスについてさらに深い洞察を得ることができます。
デモを予約して、PlayerZero がバックエンド アプリケーションのパフォーマンスを最適化するのにどのように役立つかを今すぐ学びましょう!
ここにも掲載されています。