【问题标题】:NLog - How do I get caller class name and method programmatically?NLog - 如何以编程方式获取调用者类名称和方法?
【发布时间】:2019-01-21 13:07:30
【问题描述】:

我正在使用https://github.com/NLog/NLog/tree/master/examples/ExtendingLoggers/LoggerWrapper 扩展 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。

如何获取值?

【问题讨论】:

    标签: c# .net logging nlog


    【解决方案1】:

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

    调用LogEventInfo.Exception 的getter 只会返回一个异常对象(如果已分配)。 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

    【讨论】:

    • Rolf 你是说我需要手动获取调用者信息并将其传递给我的 WriteMessage 方法,而我无法从 NLog 中获取它?另外,一旦我已经在 writemessage 中,那么获取它是否为时已晚,因为那时我将 WriteMessage 作为调用者而不是原始位置?
    • 我的意思是,如果您在 NLog 目标中的某个地方需要调用站点,并且您不想自己捕获它。然后只需使用${callsite}。另见github.com/NLog/NLog/wiki/Callsite-layout-renderer
    • 好的,所以在上面的代码示例中,当我在布局中引用 ${callsite} 时为时已晚,因为 callsite 说我在 WriteMessage。所以在这种情况下,我别无选择,只能自己获取呼叫者信息(但我可以得到它)——在 nlog 之外——并将其传递给WriteMessage,对吗?
    • @Howiecamp 调用 _logger.Log(typeof(MyLogger), logEvent); 时,请确保 typeof 指定包含方法 WriteMessage 的类类型。 NLog 将忽略 typeof 中指定的类(或接口)中的所有方法(确保使用 NLog 4.5 或更高版本)。另见github.com/NLog/NLog/wiki/…
    • 当我的消息出现在我的日志文件中时,它们肯定有正确的目标信息 - 没有问题。不过,我想做的是在 WriteMessage 方法中单独获取该调用站点信息,以便我可以以其他方式使用它。例如。我正在从日志信息创建弹性搜索文档,并且我希望有一个专门用于调用者信息的字段。今天,就像在日志文件中一样,调用者(调用站点)显示为整个日志记录的一部分,但我想以编程方式单独获取调用者信息。请让我知道这是否有意义。
    猜你喜欢
    • 2011-10-27
    • 2015-12-19
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多