将 Serilog 作为 Microsoft.Extentions.Logging.ILogger 正确注入 .net core 类 - 不是 ASP .Net Core

Gaz*_*z83 14 c# serilog .net-core

所以我有一个 .Net Core 控制台应用程序和一堆 .Net core 库。

库中的大多数类都有这样的构造函数。

public class ReportingManager
{
   private ILogger _logger;
   Public ReportingManager(ILogger logger)
   {
      _logger = logger;
   }
}
Run Code Online (Sandbox Code Playgroud)

具有ILogger类型Microsoft.Extentions.Logging.ILogger

在我的控制台应用程序中我有这个。

class Program
{
    static void Main(string[] args)
    {           
            var serilog = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
                .Enrich.FromLogContext()
                .WriteTo.Console(theme: AnsiConsoleTheme.Code)
                .CreateLogger();

            ReportingManager manager = new ReportingManager(serilog);

    }
}
Run Code Online (Sandbox Code Playgroud)

我在“ReportingManager manager = new ReportingManager(serilog);”处出现智能感知错误

无法从“Serilog.Core.Logger”转换为“Microsoft.Extensions.Logging.ILogger”

所以我的问题是,如何正确传入 Serilog?

在线和此处查看过,但大多数讨论的是 ASP.Net Core。

Eup*_*ric 21

您需要将 Serilog 记录器包装到Microsoft.Extensions.Logging.LoggerFactory. 这正是在 ASP.NET 中的 DI 中使用相同内容时所发生的情况。

像这样 :

Serilog.Core.Logger serilog = ...;

var loggerFactory = new LoggerFactory()
    .AddSerilog(serilog);

Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger("Logger");
Run Code Online (Sandbox Code Playgroud)

这需要Serilog.Extensions.LoggingNuGet 包。

  • 这对我或其他任何人都没有帮助。对于任何其他寻求完整答案的人,您可以在一行中完成这一切:`ILogger logger = new LoggerFactory().AddSerilog().CreateLogger("<logger name>");` (7认同)

小智 10

为了使用 DI 提供更多完整且最新的答案,以下是如何将 .Net ILogger 接口与 Serilog 结合使用。这适用于 WPF/控制台应用程序

.Net 6 ILogger 更新 - 正如 Microsoft 所说

从 .NET 6 开始,日志记录服务不再注册 ILogger 类型。使用记录器时,指定泛型类型替代 ILogger 或通过依赖项注入 (DI) 注册 ILogger。

您现在必须使用 ILogger 进行日志记录,T 是类别名称。https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line

套餐

使用 Serilog 和 .Net 6 日志记录需要以下这些包(如果您打算使用代码配置,则配置是可选的,为此我使用 appsettings.json 作为配置)

Install-Package Serilog
Install-Package Serilog.Sinks.File
Install-Package Serilog.Extensions.Logging
Install-Package Serilog.Settings.Configuration 
Install-Package Microsoft.Extensions.Logging
Install-Package Microsoft.Extensions.Logging.Configuration
Run Code Online (Sandbox Code Playgroud)

可选包(用于格式化为 JSON)

Install-Package Serilog.Formatting.Compact
Run Code Online (Sandbox Code Playgroud)

在App.cs中添加配置

  var builder = new ConfigurationBuilder();
    builder.SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json");

    Configuration = builder.Build();
Run Code Online (Sandbox Code Playgroud)

将 appsettings.json 文件添加到应用程序的根目录(确保复制到输出目录)

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "log.json",
          "rollingInterval": "Day",
          "MinimumLevel": "Information",
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

对于 Serilog 支持 Windows 环境变量的路径,因此您可以执行 %localappdata%\log\ 来存储使用中的应用程序数据等,更多信息如下:https: //github.com/serilog/serilog-settings-appsettings

格式化程序是可选的,可以将其删除,并且您可以仅以文本形式记录,“rollingInterval”可以是日、月、年。还有许多其他可接受的配置,更多信息可在此处找到:

https://github.com/serilog/serilog-settings-appsettings

添加记录器

   var seriLog = new LoggerConfiguration()
                      .ReadFrom.Configuration(Configuration)                  
                      .CreateLogger();
    
                ILoggerFactory logger = LoggerFactory.Create(logging =>
                {
                    logging.AddSerilog(seriLog);
    
                });
 ILogger<T> myLogger = logger.CreateLogger<T>();
Run Code Online (Sandbox Code Playgroud)

如果你使用 DI,你需要像这样注册这个记录器

 services.AddSingleton(myLogger);  
Run Code Online (Sandbox Code Playgroud)

现在,您可以在应用程序类中使用 Microsoft ILogger 接口(如果构造函数注入,则将 ILogger 作为参数构造函数传递),并且 Serilog 将成为底层日志记录提供程序。


liv*_*ve2 9

我需要在 .net core 控制台应用程序中使用记录器来登录文件。这是我的解决方案...

PM> install-package Serilog.Extensions.Hosting
PM> install-package Serilog.Sinks.File
Run Code Online (Sandbox Code Playgroud)
//Serilog configuration
var serilogLogger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

//Create a logger factory
var loggerFactory = new LoggerFactory().AddSerilog(serilogLogger);

//Get a logger
var logger = loggerFactory.CreateLogger<MyService>();
Run Code Online (Sandbox Code Playgroud)