登录没有.DI的.NET Core?

Jez*_*Jez 4 c# logging asp.net-core

看来Microsoft确实在尝试使用.NET Core来简化DI,但我不确定为什么,但是坦率地说,我的控制台应用程序又小又简单,我只是不想为构建一个完整的DI容器而已。做一些简单的日志记录。如何在不使用DI的情况下登录.NET Core?我读过的所有内容都假定您将使用.NET Core的内置日志记录体系结构,该体系结构显然需要DI,但是必须有一种方法可以在类上不使用静态变量的情况下不进行DI?

noo*_*ntz 20

根据 Scotts 答案中 Ilyas 和 bokibegs 的评论,这里是 .NET 5.0 当前工作的代码:

using Microsoft.Extensions.Logging;
Run Code Online (Sandbox Code Playgroud)
var factory = LoggerFactory.Create(builder => {
    builder.AddConsole();
});

var logger = factory.CreateLogger<T>();
Run Code Online (Sandbox Code Playgroud)

这需要Microsoft.Extensions.LoggingMicrosoft.Extensions.Logging.Consolenuget 包。


Jez*_*Jez 6

我最终做的是使用 NLog,而不是使用他们的 .NET Core DI 扩展,我只是包含了主要的 NLog NuGet 包,手动创建我自己的NLog.config文件,然后按照教程将其GetCurrentClassLogger()创建为我的类的静态成员,然后直接将其用于日志记录。这是一个非常简单的设置,不需要 DI。NLog 可能应该更好地记录它。

  • 我专业使用 NLog 已有 6 年了。它非常可靠且易于使用。 (2认同)

Sco*_*ain 5

如果您想自己做,则需要在某个地方实例化LoggerFactory实例并配置所需的提供程序。然后,您只需要调用CreateLogger来创建实例或用于new Logger<T>(ILoggerFactory)创建记录器。

using Microsoft.Extensions.Logging;

static class MyLogger {

    public static ILoggerFactory LoggerFactory {get;}

    static MyLogger() {
        LoggerFactory = new LoggerFactory();
        LoggerFactory.AddConsole();
    }
}

public MyClass {
    private readonly ILogger _logger = new Logger<MyClass>(MyLogger.LoggerFactory);
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来这在最新的 .Net Core 中已经过时了,取而代之的是 ILoggingBuilder 扩展,它实际上再次与 DI 硬耦合...... (9认同)
  • 任何有价值的相关链接:[使用没有依赖注入的 ILogger](https://github.com/aspnet/Extensions/issues/615) (3认同)