[英]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.