[英]Serilog not logging to SQL Server
在我的 .NET Core 3.1 项目中,我安装了 Serilog 并尝试遵循所有实施细节,但由于某种原因,它没有登录到 SQL 服务器表。
这是代码 - Web API 程序:
public class Program
{
public static void Main(string[] args)
{
try
{
var iWebHost = CreateHostBuilder(args).Build();
var path = Directory.GetCurrentDirectory();
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
var configuration = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{environmentName}.json", optional: true)
.Build();
var logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.ReadFrom.Configuration(configuration)
.CreateLogger();
Log.Logger = logger;
iWebHost.Run();
}
catch (Exception exception)
{
Log.Fatal(exception, "Error starting");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog();
}
appsettings.json 和 appsettings.development.json
{
"Serilog": {
"Using": [ "Serilog.Sinks.MSSqlServer" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"System": "Warning",
"Microsoft": "Warning"
},
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "Server=localhost; Initial Catalog=GP; User ID=lc; Password=lc",
"tableName": "Log"
}
}
]
}
}
}
这是我的主要 controller
public class MainController : ControllerBase
{
private readonly ILogger<MainController> _logger;
public MainController(ILogger<MainController> logger)
{
_logger = logger;
}
}
这是我想从中写入日志的 controller:
public async Task<ResponseBase> GetAsync(RequestBase request)
{
_logger.LogInformation("in controller");
// other code
// return;
}
这是我的日志实体
public class Log
{
public int Id { get; set; }
public string Message { get; set; }
public string MessageTemplate { get; set; }
public string Level { get; set; }
public DateTimeOffset TimeStamp { get; set; }
public string Exception { get; set; }
public string Properties { get; set; }
public string LogEvent { get; set; }
}
您的代码在 Serilog 的配置之前调用UseSerilog()
。 这意味着应用程序以默认的、未配置的记录器结束。 您可以通过使用内联初始化和UseSerilog
重载配置 Serilog 来避免这种情况,该重载提供对 HostingContext 的访问。 从链接的文档:
.UseSerilog((hostingContext, services, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console())
这会从配置中读取 Serilog 的设置并添加控制台记录器,确保即使配置不正确,您也会收到日志消息。
没有理由单独创建配置。 CreateDefaultBuilder()
将当前目录设置为根目录并添加appsettings
文件。 要扩展此功能,请在CreateDefaultBuilder()
之后使用ConfigureHostConfiguration
或ConfigureAppConfiguration
。
CreateHostBuilder
应更改为:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog((hostingContext, services, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console());
Main
是:
public static void Main(string[] args)
{
CreateHostBuilder(args).Run();
}
如果你想在构建主机之前使用记录器,你应该在调用UseSerilog()
之前创建它:
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.ReadFrom.Configuration(configuration)
.WriteTo.Console()
.CreateLogger();
try
{
CreateHostBuilder(args).Run();
}
catch (Exception exception)
{
Log.Fatal(exception, "Error starting");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.