在 .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();
}
}
我手动创建了日志 table 并为其创建了单独的迁移。日志实体如下所示:
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();
}
}
当我 运行 本地主机中的应用程序时,记录器工作 - 我可以在日志 table 中看到日志。但是,在我将应用程序部署到生产环境(Azure 和其他一些基于 IIS 的托管平台)后,我可以看到日志 table 已创建,但它始终为空。即使我点击 Home/Index 操作也没有出现异常,只是什么也没有发生。知道我做错了什么以及为什么应用程序不在数据库中创建日志吗?
您的 SqlServerConnectionString 是否正确?还要确保在 Startup.cs 中构建虚拟主机时调用 UseSerilog()。它可能仅为开发环境添加。
可能是您忘记在应用程序启动时在 Program
class 中调用 SeriLog
。所以尝试以下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging(logging => { logging.ClearProviders(); }) // clearing all other logging providers
.UseSerilog(); // Using serilog
好的,所以我终于找到了解决方法。 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 工作的。我根据 this article 解决了问题
不太喜欢这个添加 web.config
文件的解决方案,因为在 CD 管道中进行管理并不是那么简单,例如具有所有应用程序设置的 JSON 文件。
我使用 .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();
}
}
我手动创建了日志 table 并为其创建了单独的迁移。日志实体如下所示:
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();
}
}
当我 运行 本地主机中的应用程序时,记录器工作 - 我可以在日志 table 中看到日志。但是,在我将应用程序部署到生产环境(Azure 和其他一些基于 IIS 的托管平台)后,我可以看到日志 table 已创建,但它始终为空。即使我点击 Home/Index 操作也没有出现异常,只是什么也没有发生。知道我做错了什么以及为什么应用程序不在数据库中创建日志吗?
您的 SqlServerConnectionString 是否正确?还要确保在 Startup.cs 中构建虚拟主机时调用 UseSerilog()。它可能仅为开发环境添加。
可能是您忘记在应用程序启动时在 Program
class 中调用 SeriLog
。所以尝试以下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging(logging => { logging.ClearProviders(); }) // clearing all other logging providers
.UseSerilog(); // Using serilog
好的,所以我终于找到了解决方法。 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 工作的。我根据 this article 解决了问题
不太喜欢这个添加 web.config
文件的解决方案,因为在 CD 管道中进行管理并不是那么简单,例如具有所有应用程序设置的 JSON 文件。