gpt4 book ai didi

c# - ILogger 的隐式范围

转载 作者:行者123 更新时间:2023-12-02 18:20:41 28 4
gpt4 key购买 nike

我正在使用 Microsoft.Extensions.Logging (MEL) 中的 ConsoleLoggerProvider 在 .NET 6 控制台应用程序中写入日志。

我希望我的日志包含每个日志条目的“类”和“方法”记录,以便知道日志消息是从我的代码中的“何处”写入的。

在不使用 Serilog 等第三方日志记录解决方案的情况下,当前唯一的方法是使用 MEL 中“日志范围”的内置功能。<​​/p>

所以我最终写了这样的代码:

public class MyClass {

ILogger _logger;

.... //Contructor, etc.

public void MyMethod()
{
using (_logger.BeginScope($"{nameof(MyClass)} => {nameof(MyMethod)}"))
{
...//actual logic is here
}
}
}

我在 MS 文档中观察到“ExternalScopeProviders”的概念,但它完全没有记录且没有示例。是否有更多“隐式”方式自动设置代码结构范围?或者我们(作为 .NET 6/C# 用户)是否必须在我们的代码中显式使用 using (_logger.BeginScope) 来实现这一点?

最佳答案

更现代的方法是使用自动生成方法名称和位置的函数。您可以为此创建一个扩展方法:

public void Log(this ILogger logger, LogLevel logLevel, string message, [CallerMemberName]string memberName = null, [CallerFilePath]string filePath = null, [CallerLineNumber]int line = 0)
{
logger.Log(logLevel, $"In function {memberName} ({filePath}:{line}): {message}");
}

(对于 ILogger 接口(interface)的其他函数也类似)

编译器自动在memberName中插入成员名(不带类/命名空间),在filePath中插入源文件,在line中插入行号> 如果您在调用站点手动填写它们。不幸的是,没有简单的方法可以通过这种方式获取调用函数的类名,但它通常与文件名相同,所以这不是什么大问题。

关于c# - ILogger 的隐式范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70918224/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com