ASP.NET Core是一个开放源代码,跨平台,精益和模块化的框架,用于构建高性能,可伸缩的Web应用程序。 ASP.NET Core带有一个现成的内置日志记录框架。 它可作为Microsoft.Extensions.Logging命名空间的一部分使用。
LoggerMessage是ASP.NET Core中隐藏但强大的功能之一,与Logger扩展方法相比,它减少了开销。 本文讨论LoggerMessage的功能和优点,以及如何在ASP.NET Core 3.0中使用LoggerMessage。
[ 也在InfoWorld上:使用Visual Studio Live Share和GitHub进行远程编码 ]
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
创建一个ASP.NET Core 3.0 API项目
首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.NET Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 在接下来显示的“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。 我将在这里使用ASP.NET Core 3.0。
- 选择“ API”作为项目模板以创建新的ASP.NET Core API应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
这将在Visual Studio中创建一个新的ASP.NET Core API项目。 在“解决方案资源管理器”窗口中选择Controllers解决方案文件夹,然后单击“添加-> Controller…”以创建一个名为DefaultController的新控制器。 我们将在本文的后续部分中使用该项目。
LoggerMessage与Logger扩展方法
与Logger扩展方法相比,LoggerMessage具有以下优点。
- 性能—与Logger扩展方法相比,LoggerMesage减少了对象分配和计算开销。 记录器扩展方法具有装箱费用。 LoggerMessage通过利用具有强类型参数的静态操作字段和扩展方法来避免装箱开销。
- 解析—与Logger扩展方法相比,在LoggerMessage中解析效率更高。 每当编写日志消息时,记录器扩展方法都必须解析消息模板。 LoggerMessage在定义消息时必须仅解析一次模板。
[ 同样在InfoWorld上:如何在ASP.NET Web API中记录请求和响应元数据 ]
在ASP.NET Core中使用LoggerMessage.Define方法
与Microsoft.Extensions.Logging命名空间有关的LoggerMessage.Define <T>静态方法可以用于.NET Core中的高性能日志记录。 使用此方法时,需要正确指定强类型参数。
这是LoggerHelper.Define方法的外观:
public static class LoggerMessage
{
public static Action<ILogger, T1, Exception> Define<T1>(
LogLevel logLevel, EventId eventId, string formatString)
{
var formatter = CreateLogValuesFormatter(
formatString, expectedNamedParameterCount: 1);
return (logger, arg1, exception) =>
{
if (logger.IsEnabled(logLevel))
{
logger.Log(logLevel, eventId,
new LogValues<T1>(formatter, arg1),
exception, LogValues<T1>.Callback);
}
};
}
}
现在,我们将探讨如何使用LoggerMessage.Define方法。 为此,让我们创建一个名为LoggerExtensions的静态类,如下所示。
internal static class LoggerExtensions
{
}
现在创建一个扩展方法以及一个Action委托,以使用LoggerMessage.Define方法记录数据,如下所示。
internal static class LoggerExtensions
{
public static void RecordNotFound(this
ILogger logger, int id) =>
NotFound(logger, id, null);
private static readonly
Action<ILogger, int, Exception>
NotFound = LoggerMessage.Define<int>
(LogLevel.Error, new EventId(1234, nameof(NotFound)),
"The record is not found: {Id}");
}
在ASP.NET Core中的Action方法中使用LoggerMessage
最后,打开我们之前创建的DefaultController类,并将默认代码替换为本节中所示的action方法。 以下代码段说明了如何利用我们刚刚在控制器的action方法中创建的扩展方法。
[HttpGet("{id}")]
public async Task<ActionResult<Author>> Get(int id)
{
var author = await _context.Authors.FindAsync(id);
if (author != null)
{
return author;
}
else
{
_logger.NotFound(id);
return NotFound();
}
}
[ 同样在InfoWorld上:您将犯下的6个Git错误-以及如何解决它们 ]
LoggerMessage.Define方法可用于创建委托,以后可用于缓存具有改进性能的日志消息。 使用LoggerMessage.Define进行记录比使用Logger扩展方法进行记录要快。 ASP.NET Core中的内置日志记录框架已经使用了一段时间。 您可以在此处找到完整的源代码 。 您可以从Microsoft的在线文档中了解有关LoggerMessage的更多信息。
From: https://www.infoworld.com/article/3535790/how-to-use-loggermessage-in-aspnet-core-30.html