繁体   English   中英

没有DI登录.NET Core?

[英]Logging in .NET Core without DI?

看起来微软真的想用 .NET Core 把 DI 塞进你的喉咙,我不知道为什么,但坦率地说,我的控制台应用程序又小又简单,我只是不想构建一个完整的 DI 容器来做一些简单的日志记录。 如何在不使用 DI 的情况下登录 .NET Core? 我读过的所有内容都假设您将使用 .NET Core 的内置日志架构,这显然需要 DI,但必须有一种方法可以在没有 DI 的情况下使用 class 上的 static 变量吗?

如果您想自己动手,则需要在某处实例化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);
}

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

using Microsoft.Extensions.Logging
var factory = LoggerFactory.Create(b => b.AddConsole());
var logger = factory.CreateLogger<T>();

这需要Microsoft.Extensions.LoggingMicrosoft.Extensions.Logging.Console nuget 包。

使用 .NET Core 6 和 NLog 4.7 的完整示例

  1. 运行do.net new console
  2. 运行do.net add package NLog
  3. 创建一个名为NLog.config 1的新文本文件。
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
        <target name="logconsole" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="logconsole" />
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>
  1. NLog.config文件添加到您的项目文件中。
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <None Include="NLog.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="NLog" Version="4.7.13" />
  </ItemGroup>
</Project>
  1. 编辑 Program.cs 文件如下:
var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("Program started.");
logger.Info("Program completed.");
  1. 运行do.net run

预计 Output

> dotnet run
2022-02-08 17:23:37.0430|INFO|Program|Program started.
2022-02-08 17:23:37.0924|INFO|Program|Program completed.

1 https://github.com/NLog/NLog/wiki/Tutorial#configure-nlog-targets-for-output

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

暂无
暂无

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

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