繁体   English   中英

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

[英]Serilog doesn't create logs in MSSqlServer database when in production for .net core 2.1.5 web app

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

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; }
}   

使用记录器的示例:

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中运行应用程序时,记录器可以工作,我可以在“日志”表中看到日志。 但是,在将应用程序部署到生产环境(Azure和其他基于IIS的托管平台)后,我可以看到Logs表已创建,但始终为空。 即使我执行了“主页/索引”操作,也不会出现异常,什么也不会发生。 有什么想法我做错了什么,为什么该应用程序没有在数据库中创建日志?

好的,所以我终于找到了解决方法。 Azure的解决方案是在Azure的“ Application Settings部分中添加一个具有“ Development价值”的Environment Variable 对于廉价的托管平台,我必须添加一个web.config文件:

<aspNetCore processPath="dotnet"
      arguments=".\MyApp.dll"
      stdoutLogEnabled="false"
      stdoutLogFile="\\?\%home%\LogFiles\stdout"
      hostingModel="InProcess">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

到.Web项目的根目录,因为它基于IIS。 我已根据本文解决了该问题。添加web.config文件不是非常喜欢此解决方案,因为在CD管道(如具有所有应用程序设置的JSON文件)中管理它并不是那么简单。

您的SqlServerConnectionString是否正确? 在Startup.cs中构建Web主机时,还请确保调用UseSerilog()。 它可能仅在开发环境中添加。

可能是您忘记了在应用程序启动时在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM