NLog-如何以编程方式获取调用方的类名和方法?

时间:2018-08-14 15:55:17

标签: c# .net logging nlog

我正在使用扩展NLog的https://github.com/NLog/NLog/tree/master/examples/ExtendingLoggers/LoggerWrapper方法,以便可以向事件添加自定义属性。所以我的代码如下:

    public void WriteMessage(string eventID, string message)
    {
        LogEventInfo logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, message);

        logEvent.Properties["EventID"] = eventID;

        _logger.Log(typeof(MyLogger), logEvent);
    }

WriteMessage方法中,我尝试获取调用方类和方法名称,如下所示:

logEvent.CallerClassName;
logEvent.CallerMemberName;

但都返回null。

如何获取值?

1 个答案:

答案 0 :(得分:5)

就像您可以分配LogEventInfo.Exception一样,您也可以分配LogEventInfo.CallerClassName(或LogEventInfo.CallerMemberName)。

如果为LogEventInfo.Exception调用getter,则只会分配一个Exception对象。 LogEventInfo.CallerClassName(或LogEventInfo.CallerMemberName)也是如此

NLog Logger负责捕获呼叫站点。 Logger在接收到LogEventInfo时执行捕获。捕获非常昂贵,并且仅在将目标配置为使用呼叫站点时才会发生。

不要试图自己走StackTrace。然后,您可能想利用呼叫者信息:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/caller-information

NLog正在通过使用呼叫者信息来改善呼叫站点的性能。参见https://github.com/NLog/NLog/pull/2527