如何对 Serilog 进行故障排除?

问题描述 投票:0回答:1

我已经开始在各种项目中使用 Serilog,并且几乎总是存在一些日志数据未通过的问题。

例如,现在我有一个简单的 C# .NET core 6 项目。安装了所有需要的块,项目按预期启动,但没有创建包含日志数据的文件。我打开 selflog 来跟踪问题:

Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));

但是没有更多信息打印到调试窗口?

这里是 winform 应用程序的一些部分:

    [STAThread]
            static void Main()
            {
                // To customize application configuration such as set high DPI settings or default font,
                // see https://aka.ms/applicationconfiguration.
                ApplicationConfiguration.Initialize();
    
                Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));
                var configuration = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())   
                                .AddJsonFile("appsettings.json")
                                .Build();
    
                var loggerConfig = new LoggerConfiguration();
                Log.Logger = loggerConfig.ReadFrom.Configuration(configuration).CreateLogger();
    
                var appSettings = AppSettingsHelper.GetAppSettings();
                var mainPresenter = CompositionRoot(appSettings);
                Application.Run(mainPresenter.GetViewForm());
            }

static IHostBuilder CreateHostBuilder(AppSettings appSettings)
        {
            var httpClient = CreateHttpClient();
            return Host.CreateDefaultBuilder()
                .UseSerilog((hostingContext, configuration) => configuration
                                                                        .ReadFrom.Configuration(hostingContext.Configuration)
                                                                        .Enrich.FromLogContext())
                .ConfigureServices((context, services) =>
                {
                    services.AddTransient<IMainModel, MainModel>();
                });

        }
        static IMainPresenter CompositionRoot(AppSettings appSettings)
        {
            var hostBuilder = CreateHostBuilder(appSettings);
            var host = hostBuilder.Build();

            var serviceProvider = host.Services;
            
            return serviceProvider.GetService<IMainPresenter>();
        }

我可以在调试模式下看到它已经加载了应用程序设置和文件接收器:

{
  "serilog": {
    "Using": [
      "Serilog.Enrichers.Environment"
    ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "/Logs/log.txt",
          "outputTemplate": "{Timestamp:G} {SourceContext} [{Level}] {Message}{NewLine:1}{Exception:1}",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
          "fileSizeLimitBytes": 1000000,
          "rollOnFileSizeLimit": "true",
          "shared": "true",
          "flushToDiskInterval": 3
        }

      }
    ]
  }
}

要获取日志数据,其中一些已执行但仍然没有文件:

_logger.LogInformation("...");

那么如何解决这个问题呢?在哪里可以找到文件未创建的原因?

编辑: 通过在 appsettings 中添加写入控制台并将我的 winform 项目切换到控制台项目,我可以看到我得到了预期的日志数据。但是仍然没有创建文件?

最终编辑: 好吧,几个小时后我在 stackoverflow 上找到了一个建议,“Serilog.Sinks.File”应该像这样包含在使用中:

  "serilog": {
    "Using": [
      "Serilog.Enrichers.Environment","Serilog.Sinks.File"
    ],

这个主题的问题仍然存在,如何在不花费数小时的情况下解决这个问题,selflog 显然是不够的。

c# .net logging serilog
1个回答
0
投票

在 Visual Studio 中执行此操作的最快方法可能是检查

Log.Logger
.
这样做,您将找到配置的任何可能设置的值。

您可以导航到其内部

_sinks
属性,以便查看存在哪些接收器。

如果这里没有出现,你至少知道你的配置有问题。

下面的例子有一个

ConsoleSink
PeriodicFlushToDiskSink
这是
RollingFileSink
.

鉴于

"path": "/Logs/log.txt"
FileAppender
配置,下图显示实际文件将写入
C:\Logs\
文件夹中。

要将该文件放在应用程序文件夹的子文件夹中,请使用

./Logs/log.txt
.


我可以在

Serilog.Sinks.File
部分中没有
Using
的情况下运行您的上述设置,它只是没有在预期的位置登录。

© www.soinside.com 2019 - 2024. All rights reserved.