作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我是一名优秀的程序员,十分优秀!