【问题标题】:CreateLogger() was previously called and can only be called onceCreateLogger() 之前被调用过,只能调用一次
【发布时间】:2021-08-17 15:46:11
【问题描述】:

我得到以下异常:

CreateLogger() 之前被调用过,只能调用一次。

我不知道CreateLogger() 何时被调用了两次。

我的配置是这样的:

   public static void Main(string[] args)
        {
            try
            {
                var host = CreateHostBuilder(args).Build();
                Log.Information("Starting host...");
                host.Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly."); //HERE IS THE EXCEPTION: CreateLogger() was previously called and can only be called once.
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseSerilog((provider, context, loggerConfig) =>
                    {
                        loggerConfig.Configure(provider, Configuration);
                    });
                });

我在调用库中的扩展方法:

  public static void Configure(this LoggerConfiguration loggerConfig,
        IServiceProvider provider, IConfiguration config)
        {
            var sqlserverConnectionString = config["ConnectionStrings:S1"];
            var sqlserverLogTable = config["Logging:S2"];
            var rollingFileName = config["Logging:S3"];

            var sinkOpts = new MSSqlServerSinkOptions();
            sinkOpts.TableName = sqlserverLogTable;
            sinkOpts.AutoCreateSqlTable = true;
            var columnOpts = new ColumnOptions();
            columnOpts.Store.Remove(StandardColumn.Properties);
            columnOpts.Store.Add(StandardColumn.LogEvent);
            columnOpts.LogEvent.DataLength = 2048;
            columnOpts.PrimaryKey = columnOpts.TimeStamp;
            columnOpts.TimeStamp.NonClusteredIndex = true;


            loggerConfig
                .ReadFrom.Configuration(config)
                .Enrich.FromLogContext()
                .Enrich.WithMachineName()
                .Enrich.WithAssemblyName()
                .Enrich.WithAssemblyVersion()
                .Enrich.WithAspnetcoreHttpcontext(provider, GetContextInfo)
                .WriteTo.File(rollingFileName)
               .WriteTo.MSSqlServer(
                    connectionString: sqlserverConnectionString,
                    sinkOptions: sinkOpts,
                    columnOptions: columnOpts
                ).CreateLogger();
        }

【问题讨论】:

  • 你真的需要在这里打电话给CreateLogger吗?您不需要创建记录器,因为您只是在配置它。只需删除该行。
  • @DavidG 我应该不在这里调用它,根据文档,这就是我配置 serilog 的方式
  • 只有在配置周期中需要记录器对象写入日志时。删除它,看看会发生什么......
  • @DavidG 非常感谢。

标签: c# asp.net-core configuration .net-5 serilog


【解决方案1】:

UseSerilog calls CreateLogger internally... 所以要么:

  • 不要自己调用 CreateLogger,让UseSerilog 为你做这件事
  • UseSerilog 使用不同的重载,您可以将ILogger 指定为您自己创建的ILogger

【讨论】:

    【解决方案2】:

    @C。 Augusto Proiete 已经简短地解释了......如果你想看看,这是一些detail

    您的代码在第 183 行执行,因为 useReload 变量应该为空,就好像您没有对记录器做任何事情一样,变量 reloadable 应该是假的,因为它最初评估为 ReloadableLogger reloadable = Log.Logger as ReloadableLogger;(什么位于未直接显示在该文件上的屏幕后面)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-02
      • 2021-01-04
      • 2019-08-23
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多