簡體   English   中英

如何優化獲取記錄器的當前名稱空間,類名稱,方法名稱

[英]How to optimize getting current namespace, class name, method name for logger

我正在嘗試記錄異常,在該異常中獲取執行方法的名稱及其類名和名稱空間。 像這樣:

在此處輸入圖片說明

現在,我可以像這樣獲得所需的一切:

Log.AppendLog(typeof(FamilyPublishCommand).Namespace + "." + GetType().Name + "." + MethodBase.GetCurrentMethod().Name + ": Started.");

有沒有辦法將我正在做的所有事情都獲得正確的名稱空間,類和方法名,移到駐留在不同程序集中的靜態實用程序方法?

我正在考慮僅將其與Log功能放在一起,它將與我正在獲取信息的當前功能不在同一程序集中。 有什么辦法我可以分開這些嗎?

無論您使用哪種裝配,以下內容都將起作用:

using System.Reflection;
static void Log(MethodBase method, string msg)
{
    Console.WriteLine("{0}.{1}: {2}", method.ReflectedType.FullName, method.Name, msg);
}

用法:

Log(MethodBase.GetCurrentMethod(), myString);

那是解決問題的最簡單的方法。

如果不想每次都執行MethodBase.GetCurrentMethod() ,則必須從Log內獲取調用方法。 您可以這樣做:

MethodBase method = new StackFrame(1).GetMethod();

因此, Log變為:

using System.Reflection;
using System.Diagnostics;
static void Log(string msg)
{
    var method = new StackFrame(1).GetMethod();
    Console.WriteLine("{0}.{1}: {2}", method.ReflectedType.FullName, method.Name, msg);
}

Console.WriteLine替換您自己的日志記錄方法,一切順利。

同樣,出於完整性考慮,如果您不關心名稱空間和類,而只關心調用Log的方法的名稱,則可以使用CallerMemberName進一步簡化Log

static void Log(string msg, [CallerMemberName] string caller = "")
{
    Console.WriteLine("{0}: {1}", caller, msg);
}

如果您采用類似於NLog的方法(對於每個類創建一個單獨的靜態Logger對象),這將很有用,因此您只需要執行一次StackTrace,此后就只關心方法名稱。 但是,如果您希望所有這些都包含在一個方法中,那么第二種解決方案就是解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM