JavaScript および TypeScript 用の依存関係のない構造化ログ ライブラリである LogTape が v0.6.0 をリリースしました。何が変わりましたか?
LogTape の機能の 1 つは、階層カテゴリによるシンクの継承です。たとえば、次のように 2 つのロガーを設定するとします。
import { configure, getConsoleSink, getFileSink } from "@logtape/logtape"; await configure({ sinks: { console: getConsoleSink(), file: getFileSink("app.log"), }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"] }, ], });
["app"] ロガーに書き込まれたログは app.log ファイルにのみ保存されますが、["app", "module"] ロガーに書き込まれたログは両方のファイルに保存されますapp.log ファイルとコンソールへの出力。これは、["app", "module"] ロガーがその親カテゴリ ["app"] からシンクを継承するためです。
ただし、場合によっては、この動作が望ましくない場合もあります。 LogTape 0.6.0 以降では、親ロガーのシンクをオーバーライドできるようになりました。たとえば、次のように子ロガーのparentSinks: "override" オプションを有効にした場合:
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
["app"] ロガーに書き込まれたログは app.log ファイルにのみ保存され、["app", "module"] ロガーに書き込まれたログは次の場所にのみ出力されます。コンソール。これは、子ロガー ["app", "module"] が ["app"] ロガーのシンクをオーバーライドしたためです。
もちろん、デフォルト値はparentSinks: "inherit"なので、オプションを指定しない場合は以前と同じように動作します。
この機能追加の背景について知りたい場合は、GitHub issue #15 を参照してください。
以前のバージョンでは、次のようにログした場合:
logger.info("Hello, { name }!", { name: "Alice" });
予想に反して、Hello, unfineed! のログが表示されました。が作成されることになります。これは、プレースホルダー { name } にスペース文字が含まれていたため、「name」ではなくプロパティ「 name 」が検索されたためです。つまり、次のようにプレースホルダーからスペースを削除する必要がありました。
logger.info("Hello, {name}!", { name: "Alice" });
または、次のように実際のプロパティ名に同じスペースを追加します。
logger.info("Hello, { name }!", { " name ": "Alice" });
これは厳密にはバグではありませんが、コーディングの習慣によっては間違いが起こりやすい動作でした。
ただし、LogTape 0.6.0 以降では、プレースホルダーの先頭と末尾にスペースがある場合でも、スペースのないプロパティ名が検索されます。たとえば、次のようにログを記録した場合:
logger.info("Hello, { name }!", { name: "Alice" });
さすが、ハローアリスのログ!
が作成されます。ただし、空白文字も含めて完全一致するプロパティがあった場合は、それが優先されます。たとえば、次のようにログを記録した場合:
logger.info("Hello, { name }!", { name: "Alice", " name ": "Bob" });
こんにちは、ボブ! Hello,Alice! の代わりにログに記録されます。
この機能追加の背景について知りたい場合は、GitHub issue #16 を参照してください。
LogRecord は、LogTape によって出力およびフォーマットされる前のログを表すデータ型です。
LogRecord.message プロパティはすでに存在していましたが、このプロパティには、メッセージ テンプレート内のプレースホルダーが実際のプロパティ値に置き換えられた後の結果が含まれていました。ほとんどの場合、これで十分でしたが、ログの出力先 (シンク) が別のログ システムである場合は、元のメッセージ テンプレートとプロパティ値を別々に出力して、受信ログ システムがメッセージ テンプレート内のプレースホルダーをプロパティに置き換えられるようにすることをお勧めします。直接値を設定します。
LogTape 0.6.0 で追加された LogRecord.rawMessage は、まさにこの目的のためのプロパティであり、プレースホルダーが置換されていないメッセージ テンプレートの元の状態が含まれています。たとえば、次のようにログを記録した場合:
logger.info("Hello, {name}!", { name: "Alice" });
LogRecord.message には値 ["Hello, ", "Alice", "!"] が含まれますが、LogRecord.rawMessage には値 "Hello, {name}!" が含まれます。
この機能追加の背景について知りたい場合は、GitHub issue #17 を参照してください。
テキスト フォーマッタは、ストリーム シンクやファイル シンクなどで各ログをテキストにフォーマットする方法を決定するインターフェイスです。実際の型定義は非常に単純です。
export type TextFormatter = (record: LogRecord) => string;
ただし、テキスト フォーマッタを毎回直接定義するのは面倒な場合があるため、LogTape には、使用できる組み込みのdefaultTextFormatter および ansiColorFormatter があります。これまでは追加の設定ができなかったため、あらかじめ決められた形式をそのまま受け入れる必要がありました。たとえば、「警告」などのログ レベルが WRN のような 3 文字の略語で出力されるのが気に入らない場合は、TextFormatter を最初から実装する必要がありました。
ただし、LogTape 0.6.0 以降では、TextFormatter を最初から実装しなくても、getDefaultTextFormatter() 関数と getAnsiColorFormatter() 関数を使用して、さまざまな書式設定を好みに合わせてカスタマイズできます。
For example, if you want to represent log levels like "warning" as a single uppercase letter W, you can configure it like this:
const myFormatter = getDefaultTextFormatter({ level: "L" });
Or if you want to omit the date and timezone from the timestamp and only show the time, you can configure it like this:
const myFormatter = getDefaultTextFormatter({ timestamp: "time" });
For descriptions of more formatting options, please refer to the related documentation.
If you're curious about the background of this feature addition, please refer to GitHub issue #13.
LogTape 0.6.0 is already available on JSR and npm, so get it now!
deno add @logtape/logtape@0.6.0 # Deno npm add @logtape/logtape@0.6.0 # npm pnpm add @logtape/logtape@0.6.0 # pnpm yarn add @logtape/logtape@0.6.0 # Yarn bun add @logtape/logtape@0.6.0 # Bun
Happy logging!
以上がLogTape .eleased: 新機能は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。