MS Logger factory 和 Serilog 问题获取日志消息到文件

MS Logger factory and Serilog issue getting log messages to file

我一直在构建一个工具来解决一些与数据相关的问题。底线是在 .Net 5.0 中,未来将移植到 .net 6.0。

我过去使用 Serilog 没有问题。但作为我的“工具”的一部分,我需要使用 TCP 服务器。我选择使用 WastonTCP,因为它很简单。

问题在于它使用 MS Logger 工厂并默认输出到控制台。不是生产所需的结果。

当我现在 运行 应用程序时,我在日志中得到了启动和停止消息,但是 none 下面显示了这些消息

我想要在 serilog 中的这些消息。 这是 program.cs 代码:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Enrichers;
using Serilog.Events;
using System;

namespace PostDataService
{
  public class Program
  {

    public static void Main(string[] args)
    {
      const string _logTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff}\t{EnvironmentUserName}\t[{Level:u4}]\t<{ThreadId}>\t{Message:lj}{NewLine}{Exception}";
      var loggerConfig = new LoggerConfiguration()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Verbose)
        .Enrich.WithThreadId()
        .Enrich.WithEnvironmentUserName()
        .WriteTo.File("./App_Data/logs/USPS.Log",
        fileSizeLimitBytes: 524288000,
        outputTemplate: _logTemplate);

      Log.Logger = loggerConfig.CreateLogger();
      try
      {
        Log.Write(LogEventLevel.Information, "Start USPS Data Server");
        CreateHostBuilder(args).Build().Run();
      }
      catch (Exception ex)
      {
        Log.Fatal(ex, "Host terminated unexpectedly");
      }
      finally
      {
        Log.Information("USPS Server stopped");
        Log.CloseAndFlush();
      }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
              services.AddHostedService<Worker>();
            });

  }
}

我是 MS 记录器工具的新手,所以不确定这是否是问题所在 and/or 事实上,我 运行 将 TCP 服务器作为后台工作者存在问题.

这是 worker.cs 中的 ExecuteAsync 方法,它生成屏幕截图中的第一条消息。

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
      //_logger.LogInformation("Worker running at: {time} {threadid}", DateTimeOffset.Now, Thread.CurrentThread.ManagedThreadId);
      while (!stoppingToken.IsCancellationRequested)
      {
        if (_msgcnt == 0 || (_msgcnt % 500 == 0) )
        {
          _logger.LogInformation("Worker running at: {time} {threadid}", DateTimeOffset.Now, Thread.CurrentThread.ManagedThreadId);
        }
        //_logger.LogInformation("Worker running at: {time} {threadid}", DateTimeOffset.Now, Thread.CurrentThread.ManagedThreadId);
        _msgcnt++;
        await Task.Delay(500, stoppingToken);
      }
      //_Server.Stop();
    }

这是appsettings.Developement.json(与appsettings.json相同):

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "FormatterOptions": {
      "SingleLine":  true
    }
  }
}

当您执行 Log.Logger = loggerConfig.CreateLogger(); 时,您正在配置全局静态 Serilog.Log 对象。只要您通过 Log.Write() 等调用它,它就会起作用。

您的问题源于这样一个事实,即在您的工作人员中,我猜您使用的是注入 ILogger<>。这将注入一个 MS ILogger。很遗憾,您没有告诉 MS ILogger 使用 serilog。

将两者联系起来应该很简单 (as per the instructions);你只需告诉主机构建器你想使用 Serilog:

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .UseSerilog() // <- this right here
    .ConfigureServices((hostContext, services) => { ... });

奖励:您稍后可以使用 Serilog.Settings.Configuration 将您的配置移动到 appsettings.json,一旦您获得上面的代码优先配置工作。每次您想 log/filter 解决某些问题时,都会避免您重建。