首页 文章

在 生产环境 .net核心2.1.5 Web应用程序时,Serilog不会在MSSqlServer数据库中创建日志

提问于
浏览
0

我使用.net core 2.1.5在asp.net MVC中创建了一个Web应用程序 . 这是我在Serilog的Startup.cs文件中创建的唯一配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{          
    ...

    loggerFactory.AddSerilog();
    Log.Logger = new LoggerConfiguration()
       .MinimumLevel.Verbose()
       .WriteTo.MSSqlServer(
            connectionString: Configuration.GetSection("SqlServerConnectionString").Get<string>(),
            tableName: "Logs",
            restrictedToMinimumLevel: LogEventLevel.Verbose,
            columnOptions: new ColumnOptions()
        )
       .CreateLogger();

    using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
    {
        var context = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>();
        context.Database.Migrate();
        context.Database.EnsureCreated();
    }          
}

我手动创建了Logs表,并为它创建了一个单独的迁移 . Logs实体如下所示:

public class Logs
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Message { get; set; }

    public string MessageTemplate { get; set; }

    [MaxLength(128)]
    public string Level { get; set; }

    [Required]
    public DateTime TimeStamp { get; set; }

    public string Exception { get; set; }

    public string Properties { get; set; }
}

使用 Logger 的示例:

public class HomeController : Controller
{
    readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public async Task<IActionResult> Index()
    {
        var obj = new { blah = "test12345", blah2 = "fsdf" };
        _logger.LogInformation("sadfsadfsadf",obj);

        return View();
    }
}

当我在localhost中运行应用程序时, Logger 工作 - 我可以在Logs表中看到日志 . 但是,在我将应用程序部署到 生产环境 环境(Azure和其他基于IIS的托管平台)之后,我可以看到Logs表已经创建,但它始终为空 . 即使我点击Home / Index动作也没有出现异常,但没有任何反应 . 任何想法我做错了什么以及为什么应用程序不在数据库中创建日志?

2 回答

  • 0

    可能是您忘记在应用程序启动时在 Program 类中调用 SeriLog . 所以尝试以下方法:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .ConfigureLogging(logging => { logging.ClearProviders(); }) // clearing all other logging providers
                    .UseSerilog(); // Using serilog
    
  • 0

    你的SqlServerConnectionString是否正确?还要确保在Startup.cs中构建webhost时调用UseSerilog() . 它可能仅为开发环境添加 .

相关问题