.net 如何排除Serilog故障?

eyh26e7m  于 2023-03-20  发布在  .NET
关注(0)|答案(1)|浏览(156)

bounty将在2天后过期。回答此问题可获得+350的声誉奖励。Banshee正在寻找来自声誉良好的来源的答案

我已经开始在所有类型的项目中使用Serilog,几乎总是有一些日志数据没有通过的问题。
例如,现在我有一个简单的C# .NET core 6项目,所有需要的nuggets都安装好了,项目正常启动,但是没有创建包含日志数据的文件,我打开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>();
        }

在调试模式下,我可以看到它已经加载了appsettings和文件接收器:

{
  "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中添加write to console并将我的winform项目切换到console项目,我可以看到我得到了预期的日志数据。但是仍然没有创建文件?
**最终编辑:**好的,几个小时后我发现了一个关于stackoverflow的建议,“Serilog.sinks.file”应该包含在使用中,如下所示:

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

然而这个主题的问题仍然存在,如何在不花费时间的情况下排除故障,selflog显然是不够的。

ohfgkhjo

ohfgkhjo1#

在Visual Studio中最快的方法可能是检查Log.Logger
这样做,您将找到配置的任何可能设置的值。
您可以导航到其内部_sinks属性,以便查看存在哪些接收器。
如果这里没有显示,您至少知道您的配置中有一些不正常的地方。
下面的示例具有ConsoleSinkPeriodicFlushToDiskSink,后者是RollingFileSink

根据RollingFileSink"path": "/Logs/log.txt"配置,下图显示实际文件将写入C:\Logs\文件夹。
要将该文件放在应用程序文件夹的子文件夹中,请使用./Logs/log.txt

相关问题