LogTape (JavaScript および TypeScript 用の依存関係のない構造化ログ ライブラリ) が 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() 関数を使用して、さまざまな書式設定を好みに合わせてカスタマイズできます。
たとえば、「警告」のようなログ レベルを 1 つの大文字 W で表したい場合は、次のように設定できます。
const myFormatter = getDefaultTextFormatter({ level: "L" });
または、タイムスタンプから日付とタイムゾーンを省略して時刻のみを表示したい場合は、次のように設定できます:
const myFormatter = getDefaultTextFormatter({ timestamp: "time" });
その他の書式設定オプションの説明については、関連ドキュメントを参照してください。
この機能追加の背景について知りたい場合は、GitHub issue #13 を参照してください。
LogTape 0.6.0 はすでに JSR と npm で利用可能ですので、今すぐ入手してください!
deno add @logtape/[email protected] # Deno npm add @logtape/[email protected] # npm pnpm add @logtape/[email protected] # pnpm yarn add @logtape/[email protected] # Yarn bun add @logtape/[email protected] # Bun
ログインを楽しんでください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3