Serilog: 'LogLevel'テキスト出力のカスタマイズを許可する

作成日 2020年12月03日  ·  4コメント  ·  ソース: serilog/serilog

機能リクエストは問題に関連していますか?
アプリケーションによって発行されるログレベルが次のいずれかである必要があるという厳しい要件があります。

  • DEBUG
  • ERROR
  • INFO
  • WARN

セマンティックだけでなく、テキストも正確に一致する必要があります。 これは、異なる言語とフレームワークを使用する他のいくつかのアプリケーションで使用されているログアグリゲーターに書き込んでおり、これらの文字列のレベルが標準化されているためです。

これらの値に依存する既存のツールとクエリを使用して、ログをフィルタリングおよび分析できるようにする必要があります。

希望するソリューションを説明してください
LogEvent列挙から生成されたテキストを操作するためのメカニズムを公開します。 値は完全にカスタマイズ可能で変更可能である必要があります。

理想的には、列挙型の値をテキストに変換し、列挙型のすべての処理に内部で活用される、ある種のIFormatter<LogLevel>を挿入できるようになります(使用されているシンクまたはtext / jsonフォーマッターに関係なく)。

検討した代替案を説明してください
LogEvent.Levelプロパティを調べることで、各イベントの「level」プロパティをオーバーライドするエンリッチャーを作成できます。 これは機能しますが、理想的とは言えず、ハックのように感じます。これは実際にはログ出力を「強化」していないため、メカニズムを使用して他の何かを完全に実行しています。

enhancement

最も参考になるコメント

ああ、それであなたは完全にJsonフォーマッターをバイパスしますか?! それは確かに_非常に_興味深いニックです...私が考えている今、これは他の理由でも私にとって非常に役立つと思います。 これは、両方の長所を実際に組み合わせたものです。

readme全体を読んでおらず、Jsonの例を完全に見逃しているという私の間違いです!

このエクスプレッションパッケージは、私が予想していたよりもずっと楽しいものになるでしょう。

これを閉じると、私が提案した問題が完全に解決されます。

全てのコメント4件

こんにちはジュリアーノ!

_Serilog.Expressions_は、必要に

これを行う最もクリーンな方法は、 MapLevel()ユーザー定義関数で実装することです。

https://github.com/serilog/serilog-expressions#implementing -user-defined-functions

出力テンプレートでMapLevel()します。

何かのようなもの:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console(new ExpressionTemplate(
        "[{<strong i="15">@t</strong>:HH:mm:ss} {MapLevel(@l)} ({SourceContext})] {@m}\n{@x}"))
    .CreateLogger();

これをどのように使用するかを聞いてみるといいでしょう。これまでのところ、_Serilog.Expressions_(まったく新しい)の例はあまりありませんが、特にSerilogツールキットのコア部分になることを期待しています。 JSONとテキスト出力をカスタマイズするため。

HTH!

こんにちはニック

Serilog.Expressionsは、必要に応じてこれを実装します。

わお! この拡張機能について初めて聞いた。 私にそれを指摘してくれてありがとう。

それはかなり正気じゃないようです! 皆さんは、そのための新しいDSLを思い付くのに夢中です。

出力テンプレートでMapLevel()を使用します。

これはテキストベースのロギングでは非常にうまく機能しているようですが、問題は、現在コンパクトなjsonフォームを使用していることです。 Expressionsで許可されていることをすばやく読んだ私の理解では、現在、 ITextFormatterを使用するフローのみがサポートされています。

C# LogEventから実際に書き込まれているプロパティへの変換の間にフックがないように思えます。 理想的には、そこにあるソリューションは、テキストであれ、jsonであれ、あらゆる「出力」形式で機能します。

すでに一歩先を行く、@ julealgon! :-) _Serilog.Expressions_は、JSONを完全にサポートするように設計されています。

    .WriteTo.Console(new ExpressionTemplate(
        "{ {<strong i="6">@t</strong>, <strong i="7">@mt</strong>, <strong i="8">@l</strong>: MapLevel(@l), <strong i="9">@x</strong>, ..@p} }\n"))

https://github.com/serilog/serilog-expressions#formatting

ああ、それであなたは完全にJsonフォーマッターをバイパスしますか?! それは確かに_非常に_興味深いニックです...私が考えている今、これは他の理由でも私にとって非常に役立つと思います。 これは、両方の長所を実際に組み合わせたものです。

readme全体を読んでおらず、Jsonの例を完全に見逃しているという私の間違いです!

このエクスプレッションパッケージは、私が予想していたよりもずっと楽しいものになるでしょう。

これを閉じると、私が提案した問題が完全に解決されます。

このページは役に立ちましたか?
0 / 5 - 0 評価