如何优化获取记录器的当前名称空间,类名,方法名称

时间:2017-07-11 23:02:03

标签: c# logging

我正在尝试记录异常,其中我获得了执行方法的名称及其类名和命名空间。像这样:

enter image description here

现在,我可以得到我需要的所有东西:

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

有没有办法将我正在做的所有东西都转移到生活在不同程序集中的静态实用程序方法的正确命名空间,类和方法名称?

我正在考虑将它与Log功能放在一起,这些功能与我正在检索信息的当前组件不在同一个程序集中。我能分开这些吗?

1 个答案:

答案 0 :(得分:2)

无论你装入什么装配,以下内容都会有效:

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来简化{ {1}}更进一步:

Log

如果你采用类似于NLog的方法,在你为每个类创建一个单独的静态static void Log(string msg, [CallerMemberName] string caller = "") { Console.WriteLine("{0}: {1}", caller, msg); } 对象,这将是有用的,所以你只做一次StackTrace,从那以后你只关心它方法名称。但是,如果您希望所有这些都包含在一个方法中,那么第二种解决方案就是可行的方法。