【问题标题】:ASP.NET Core - Multiple instances of LoggerASP.NET Core - Logger 的多个实例
【发布时间】:2017-08-08 02:28:49
【问题描述】:

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

在控制器中:

ILogger<HomeController> _logger

服务中:

ILogger<ServiceName> _logger

我相信这将在每个请求时实例化,因此对于每个 HTTP 请求,它将创建多个 Logger 实例。说每个控制器和每个服务类,但它与以前的日志记录方法有点不同,我们过去只创建一个记录器实例并将其用于记录任何地方的内容。

这样做有什么缺点吗?

【问题讨论】:

    标签: c# logging asp.net-core


    【解决方案1】:

    这完全没问题。通常,实例化一个记录器很便宜,所以在性能方面完全可以这样做。

    不过,请考虑 (1) 使用 Serilog 拥有的全局日志实例或 (2) 使用在字段声明中初始化的静态字段。同样,不是出于性能原因,而是为了避免用不那么相关的东西污染您的构造函数。

    UPD 实施更新 (1)

    基本上,这只是决定将记录器初始化代码放在哪里的问题。在 ASP.NET Core 中,它将是 Main 方法的第一行(Log 是来自 Serilog 命名空间的静态类):

    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 sn-p 中有这一行,所以我只需要在每个新类中输入 lg&lt;TAB&gt;

    【讨论】:

    • 感谢您的快速回复。选项 1 有什么好的参考文章吗?
    • 听起来不错。我试图在我的代码中实现它。它有效!
    • 只有两件事:1)我必须在我的业务库中安装 serilog nuget 包才能访问日志对象 2)我没有以我的输出模板格式获取 sourcecontext,因为它是全局的。所以我们必须在日志消息中写入类 n 方法的详细信息。如有错误请指正。
    • (1) 是的,您必须这样做,但这通常没什么大不了的。它不会使您的“商业图书馆”变得不那么干净或其他什么。如果您必须避免这种情况,我想您可以围绕它实现自己的包装器,但是您仍然需要引用它位于 (2) 中的程序集,是的,您必须自己放置它; AFAIK 即使您使用构造函数注入方法,您仍然必须手动将方法名称放入日志消息中,它只是自动写入的类名;如果我错了,请纠正我
    • 不客气;另外,为了完整起见,用(2)的例子更新了答案
    猜你喜欢
    • 2018-01-05
    • 2023-01-22
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2017-08-03
    • 2019-07-14
    相关资源
    最近更新 更多