TIP
このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください
ロガー
NocoBase のロギング機能は、Winston をベースに構築されています。デフォルトでは、NocoBase はログを API リクエストログ、システム実行ログ、SQL 実行ログの3種類に分類します。このうち、API リクエストログと SQL 実行ログはアプリケーション内部で出力されますが、プラグイン開発者は通常、プラグイン関連のシステム実行ログのみを出力すれば十分です。
このドキュメントでは、プラグイン開発時にログを作成し、出力する方法について説明します。
デフォルトのログ出力方法
NocoBase は、システム実行ログを出力するためのメソッドを提供しています。これらのログは、指定されたフィールドに従って整形され、指定されたファイルに出力されます。
// デフォルトの出力方法
app.log.info("message");
// ミドルウェアでの使用例
async function (ctx, next) {
ctx.log.info("message");
}
// プラグインでの使用例
class CustomPlugin extends Plugin {
async load() {
this.log.info("message");
}
}
上記のすべてのメソッドは、以下の使い方に従います。
最初の引数はログメッセージ、2番目の引数はオプションのメタデータオブジェクトで、任意のキーと値のペアを指定できます。このオブジェクト内で、module、submodule、method は個別のフィールドとして抽出され、残りのフィールドは meta フィールドに格納されます。
app.log.info('message', {
module: 'module',
submodule: 'submodule',
method: 'method',
key1: 'value1',
key2: 'value2',
});
// => level=info timestamp=2023-12-27 10:30:23 message=message module=module submodule=submodule method=method meta={"key1": "value1", "key2": "value2"}
app.log.debug();
app.log.warn();
app.log.error();
他のファイルへの出力
システムのデフォルト出力方法はそのまま利用しつつ、デフォルトのファイルには出力したくない場合、createSystemLogger を使ってカスタムのシステムロガーインスタンスを作成できます。
import { createSystemLogger } from '@nocobase/logger';
const logger = createSystemLogger({
dirname: '/pathto/',
filename: 'xxx',
seperateError: true, // error レベルのログを 'xxx_error.log' に個別に分離して出力するかどうか
});
カスタムロガー
システムが提供する出力方法ではなく、Winston のネイティブなメソッドを使いたい場合は、以下の方法でログを作成できます。
createLogger
import { createLogger } from '@nocobase/logger';
const logger = createLogger({
// options
});
options は、元の winston.LoggerOptions を拡張したものです。
transports - 'console' | 'file' | 'dailyRotateFile' のいずれかを使って、プリセットの出力方式を適用できます。
format - 'logfmt' | 'json' | 'delimiter' のいずれかを使って、プリセットの出力フォーマットを適用できます。
app.createLogger
複数のアプリケーションを使用するシナリオでは、カスタムの出力ディレクトリやファイルを設定し、現在のアプリケーション名を持つディレクトリに出力したい場合があります。
app.createLogger({
dirname: '',
filename: 'custom', // /storage/logs/main/custom.log に出力されます
});
plugin.createLogger
使用するシナリオと使い方は app.createLogger と同じです。
class CustomPlugin extends Plugin {
async load() {
const logger = this.createLogger({
// /storage/logs/main/custom-plugin/YYYY-MM-DD.log に出力されます
dirname: 'custom-plugin',
filename: '%DATE%.log',
transports: ['dailyRotateFile'],
});
}
}