繁体   English   中英

ASP.NET Core-记录器的多个实例

[英]ASP.NET Core - Multiple instances of Logger

我现在正在使用ASP.NET Core LoggerFactorySerilog扩展名)进行日志记录。 我想将日志放入控制器和业务服务方法中。 我已经通过像这样的ILogger构造函数注入来做到这一点

在控制器中:

ILogger<HomeController> _logger

服务中:

ILogger<ServiceName> _logger

我相信这将在每个请求上实例化,因此对于每个HTTP请求,它将创建Logger多个实例。 对每个控制器和每个服务类都说,但这与以前的日志记录方法有点不同,以前的日志记录方法我们以前只创建一个日志记录器实例,并使用它来在各处记录日志。

有什么缺点吗?

很好 通常,实例化记录器很便宜,因此完全可以按性能要求进行记录。

仍然可以考虑(1)使用Serilog拥有的全局日志实例,或者(2)使用在字段声明中初始化的静态字段。 再次,不是出于性能原因,而是避免使用不太相关的内容污染构造函数。

UPD实施更新(1)

基本上,这只是决定将记录器初始化代码放入何处的问题。 在ASP.NET Core中,它将是Main方法的第一行(该LogSerilog名称空间中的静态类):

Log.Logger = new LoggerConfiguration().WriteTo.LiterateConsole(LogEventLevel.Debug, LogTemplate)
                                              .WriteTo.File(@"C:\logs\elbakogdabot.log", LogEventLevel.Debug, LogTemplate)
                                              .Enrich.FromLogContext()
                                              .CreateLogger();

(要明确一点:我从我的真实项目中获取了代码,但是记录器的实际配置可能有所不同)。

然后,我将在任何地方使用它,例如:

Log.Warning($"got a message for an unknown user: userid=[{userId}]");

这行代码可以扔到任何类中,而您不必为该类做任何额外的初始化。

UPD实施更新(2)

我想在一个典型的企业应用程序中,每次记住某些东西时,总是记住在消息中放入类名会很不方便。 因此,大多数时候我会使用static readonly字段。 使用Serilog,您可以这样:

public class XYZService
{
  private static readonly Serilog.ILogger log = Log.ForContext<XYZService>();
...

这样,您俩都不会污染构造函数,并且会自动在所有日志消息中获取类名。 我以前在ReSharper片段中都有此行,因此我只需要在每个新类中键入lg<TAB>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM