7

低レベルのロギング ライブラリは、それに送信されるあらゆる種類のログ メッセージに対処する必要があります。

これらのメッセージには、(テキストの一部として) 中かっこが含まれているものや、String.Format を使用して文字列の一部として書式設定されるパラメーターが含まれているものがあります。

たとえば、次の文字列は Logger クラスへの入力になります。

"Parameter: {Hostname} Value: {0}" フォーマッタに使用する正しい変数が送信されます。

適切に行うには、フォーマットの一部ではない中括弧をエスケープする必要があります (それらを 2 倍にすることによって)。

私は正規表現を使用してそれを行うことを考えましたが、中括弧内でこれらの文字列を一致させる方法がわからないため、これは見た目ほど単純ではありません (フォーマット目的で String.Format によって使用されないもの)。

もう 1 つの問題は、Logger クラスが可能な限り効率的にパフォーマンスを発揮する必要があることです。その操作の一部として正規表現の処理を開始すると、パフォーマンスが低下する可能性があります。

これに関する適切で既知のベストプラクティスはありますか?

4

4 に答える 4

4

たった1つの正規表現でそれを行う:

string input = "Parameter: {Hostname} Value: {0}";
input = Regex.Replace(input, @"{([^[0-9]+)}", @"{{$1}}");
Console.WriteLine(input);

出力:

パラメータ: {{ホスト名}} 値: {0}

もちろん、これは数値を含むパラメータがない限り機能しますが、それでもエスケープする必要があります{{ }}

于 2011-11-15T08:31:37.643 に答える
2

ロガーのインターフェースを調べる必要があると思います。仕組みと比較してくださいConsole.WriteLine

  • Console.WriteLine(String)指定された文字列を正確に出力します。フォーマットはなく、{と}で特別なことは何もありません。
  • Console.WriteLine(String, Object[])フォーマットを使用して出力します。{および}は、呼び出し元が{{および}}にエスケープする必要がある特殊文字です。

コード内のさまざまな中括弧の出現を区別して、意味を理解する必要があるのは、欠陥のある設計だと思います。{{への出力で発生するはずの{をエスケープする負担を負わせます。

于 2011-11-15T08:12:44.843 に答える
2

すべての中括弧を 2 倍にして{{\d+}}から、文字列内で元の形式 {{0}} => {0} に戻るように正規表現に置き換えるものを探します。
したがって、各行に対して、このようにsthを実行します

string s = input.Replace("{", "{{").Replace("}", "}}");
return Regex.Replace(s, @"{{(?<val>\d+)}}", 
                     m => { return "{" + m.Groups["val"] + "}"; }));

これは元の質問に対する技術的な回答ですが、@Anders Abelは完全に正しいです。もう一度デザインを検討する価値はあります...

于 2011-11-15T08:08:04.533 に答える
2

呼び出し元がフォーマットされた文字列を持ち、フォーマット指定子に対処できるようにするため。

Logger.Log("{0:dd/mm/yyy} {0:hh:mm:ss} {hostname} {123Component} でエラー {1:x4} が発生しました!", DateTime.UtcNow, 257)

次のような正規表現が必要です。

string input = "{0:dd/mm/yyy} {0:hh:mm:ss} {hostname} Some error {1:x4} happened on {123Component}!";
Regex reg = new Regex(@"(\{[^[0-9}]+?[^}]*\}|\{(?![0-9]+:)[^}]+?\})");
string output = reg.Replace(input, "{$1}");
Console.WriteLine(output);

これは以下を出力します:

"{0:dd/mm/yyy} {0:hh:mm:ss} {{hostname}} Some error {1:x4} happened on {{123Component}}!"

しかし、繰り返しになりますが、ログ ライブラリでこれを行う必要がないように再設計する必要があるという Anders Abel の意見に同意します。

于 2011-11-15T09:16:35.643 に答える