メソッドを呼び出すたびに文字列形式を使用する必要がないように、形式と引数のリストを渡すことができるように、いくつかの便利な拡張メソッドで拡張するロギングインターフェイスがあります。(FXCopsカルチャー情報ルールに従うのにも役立ちます)
だから私は呼び出すことができます:
logger.Debug("Created {0} with id {1}",typeof(MyObject).Name ,myObject.Id);
それ以外の:
logger.Debug(string.Format("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id));
ファイル、メソッド、行番号など、ログが書き込まれた場所に関する情報もログに取得すると非常に役立つため、少し注意が必要な状況になりました。[CallerMemberName]
これは、きちんとした、、、[CallerFilePath]
および[CallerLineNumber]
属性を使用して実現できます。
logger.Debug("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id);
次に、次のようなログエントリが表示されます。
"MyObjectProvider.cs、Provide、line:50 |ID1564でMyObjectを作成しました"
ここでの問題は、メソッドシグネチャが次のようになることです。
public static void Debug(this ILogger logger, string format [CallerMemberName] string callerMemberName = "", [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0, params object[] args)
[Caller*]
属性によってパラメーターがオプションになり、argsパラメーターでは機能しないため、これは不可能です。
また、次のようなパラメータとして、固定量の文字列を使用して複数の実装を作成しようとしました。
public static void Debug(this ILogger logger, string format [CallerMemberName] string callerMemberName = "",string arg, string arg2 , ...etc... , [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0)
しかし、 「次のメソッドまたはプロパティ間で呼び出しがあいまいです」というコンパイラエラーが発生します。
私は今この問題をほとんどあきらめていますが、私は自分自身に「多分SOは私のための解決策を見つけることができるだろう」と思いました。だからここにあります...両方を使用することは可能params object[] args
です[CallerFilePath]
か、それとも意図した結果を得る別の方法がありますか?