Max*_*lov 2 .net c# scope ilogger
我正在使用ConsoleLoggerProviderMicrosoft.Extensions.Logging (MEL) 在 .NET 6 控制台应用程序中写入日志。
我希望我的日志包含每个日志条目的“类”和“方法”记录,以了解我的代码中日志消息是“从哪里”写入的。
目前,在不使用 Serilog 等第三方日志解决方案的情况下实现此目的的唯一方法是使用 MEL 中“日志范围”的内置功能。
所以我最终编写了如下代码:
public class MyClass {
ILogger _logger;
.... //Contructor, etc.
public void MyMethod()
{
using (_logger.BeginScope($"{nameof(MyClass)} => {nameof(MyMethod)}"))
{
...//actual logic is here
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在 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}");
}
Run Code Online (Sandbox Code Playgroud)
(对于界面的其他功能也类似ILogger)
如果您不在调用站点手动填写,编译器会自动将成员名称(不带类/命名空间)memberName、源文件filePath和行号插入到 中。不幸的是,没有简单的方法可以通过这种方式获取调用函数的类名,但它通常与文件名相同,因此这并不是什么大问题。line
| 归档时间: |
|
| 查看次数: |
2870 次 |
| 最近记录: |