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

C# NLog-如何以编程方式获取调用方类名和方法?,c#,.net,logging,nlog,C#,.net,Logging,Nlog,我正在使用这种扩展NLog的方法,以便可以将自定义属性添加到我的事件中。因此,我的代码如下所示: public void WriteMessage(string eventID, string message) { LogEventInfo logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, message); logEvent.Properties["EventID"] = even

我正在使用这种扩展NLog的方法,以便可以将自定义属性添加到我的事件中。因此,我的代码如下所示:

    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


如何获取值?

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

调用
LogEventInfo.Exception
的getter只会返回一个Exception对象(如果指定了一个)。这同样适用于
LogEventInfo.CallerClassName
(或
LogEventInfo.CallerMemberName

NLog
记录器负责捕获呼叫站点。
Logger
在接收
LogEventInfo
时执行捕获。捕获成本非常高,仅当目标已配置为使用callsite时才会发生

而不是试着自己走楼梯。然后,您可能希望利用呼叫者信息:


NLog正致力于通过利用呼叫者信息来提高callsite的性能。请参见

Rolf您是说我需要手动获取呼叫者信息并将其传递到我的WriteMessage方法,而我无法从NLog获取它吗?还有,一旦我已经在writemessage中,那么我将使用writemessage作为调用者而不是原始位置来获取它是否为时已晚?我的意思是,如果您需要NLog目标中的某个位置的调用站点,并且您不想自己捕获它。然后只需使用
${callsite}
。在上面的代码示例中,当我在布局中引用
${callsite}
时,也请参见Ok,因为callsite说我在
WriteMessage
中,所以为时已晚。因此,在这种情况下,我别无选择,只能自己获取调用方信息(但我可以得到它)——在nlog之外——并将其传递到
WriteMessage
,对吗?@Howiecamp调用
\u logger.Log(typeof(MyLogger),logEvent)
确保
typeof
指定了包含方法
WriteMessage
的类类型。NLog将忽略
类型中指定的类(或接口)中的所有方法(请确保使用NLog 4.5或更新版本)。另请参见当我的消息出现在我的日志文件中时,它们肯定具有正确的目标信息-没有问题。不过,我想做的是在WriteMessage方法中单独获取callsite信息,这样我就可以以其他方式使用它。例如,我正在根据日志信息创建elasticsearch文档,我希望有一个专门用于调用方信息的字段。今天,就像在日志文件中一样,调用方(callsite)显示为整个日志记录的一部分,但我想以编程方式单独获取调用方信息。请让我知道这是否有意义。