c# - CreateLogger() 之前被调用过,只能调用一次

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

我得到以下异常:

CreateLogger() was previously called and can only be called once.

我不知道什么时候 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();
        }

最佳答案

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

  • 不要自己调用 CreateLogger,让 UseSerilog 为您完成
  • UseSerilog 使用不同的重载,在其中为其提供您自己创建的 ILogger

关于c# - CreateLogger() 之前被调用过,只能调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68820411/

相关文章:

c# - 根据内容调整 RichTextBox 的大小

c# - 无法使用 Visual Studio 2017 加载文件或程序集 'Microsoft.CodeAnalysis.LiveUnitTesting.Runtime, version= 1.7.0.0'

c# - Async GetAwaiter() 抛出奇怪的异常

user-interface - 在 Unity3d 中,如何将 float 窗口(例如光照贴图)添加到现有的一组选项卡(例如 : Inspector)?

configuration - 为什么 PHP 5.2.14 不显示任何错误(即使是从命令行)?

c# - 如何从azure表存储查询中获取超过1000个实体?

c# - "e.Cancel "在关闭事件中

configuration - 在 Cygwin 中更改默认的 XTerm 字体大小

linq - 如何在 Entity Framework 7 (Core) 中按某些实体属性动态排序

asp.net - 如何运行 'dotnet dev-certs https --trust' ?