カスタムLogManager
クラスを使用して、アプリケーションからのすべてのログを管理しています。メソッドが呼び出されたクラスを見つけることができる以下の関数があるので、ログがどこから来たのかを簡単に検出できます。
しかし、最近アプリケーションにいくつかのメソッドを実装した後、この関数を使用async
するメソッドから呼び出し元のクラスを見つけることができないように見えるという問題に遭遇しました。async
(呼び出しメソッドしか取得できないようです)
への参照を使用してロギングのパラメーターにオブジェクトを含め、this
そのように渡されたオブジェクトのタイプを取得しようとしましたが、かなりの静的メソッドがあり、これは機能しません。また、何かをログに記録するたびにこれを行う必要はありません..
非同期メソッドのクラスがどこから呼び出されているかを見つけるためのより良い解決策はありますか?
呼び出し元の場所を見つけるための私の現在の機能:
private string GetLocation()
{
string location = "Unknown";
StackTrace stackTrace = new StackTrace();
for (int i = 0; i < stackTrace.FrameCount; i++)
{
StackFrame stackFrame = stackTrace.GetFrame(i);
string foundLocation = stackFrame.GetMethod().DeclaringType.Name;
if (!foundLocation.Contains("Log"))
{
location = foundLocation;
break;
}
}
// Detects if log is comming from async method, detects method instead of classtype however
if (location.StartsWith("<"))
{
string[] temp = location.Split('>');
location = temp[0].Replace("<", "");
}
return location;
}
現在のログ方法:
#region Log Method
public static async void Log(LogLevel logLevel, string message, [CallerMemberName]string location = "")
{
LogMessage logMessage = new LogMessage(logLevel, message, location);
await AddLogToCollection(logMessage);
}
#region Aditional log methods
// Log With Formating -> doesn't work, cannot add the CallerMemberName after a range of params..
public static void Log(LogLevel logLevel, string message, params object[] args, [CallerMemberName]string location = "")
{
string formatString = String.Format(message, args);
Log(logLevel, formatString, location);
}
#endregion
#endregion