appsettings-configuration 中的 Serilog PushProperty 不起作用
Serilog PushProperty in appsettings-configuration not working
ASP.NET Core 2.2.0
| Serilog.AspNetCore 2.1.1
| Serilog.Sinks.File 4.0.0
我正在 Program.cs 中初始化 Serilog,从 appsettings.json 读取配置并在 Startup.cs -> 配置中添加中间件。一些片段:
Program.cs
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseConfiguration(Configuration)
.UseSerilog();
Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() || env.IsStaging())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseRewriter(new RewriteOptions()
.AddRedirectToWww()
.AddRedirectToHttps());
}
app.UseSession();
app.UseAuthentication();
app.UseMiddleware<SerilogAddUserInfo>();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
appsettings.json
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
},
"Enrich": "FromLogContext",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"rollingInterval": "Hour",
"outputTemplate": "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}"
}
}
]
}
SerilogMiddleware.cs
public class SerilogAddUserInfo
{
private readonly RequestDelegate _next;
public SerilogAddUserInfo(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
using (LogContext.PushProperty("Address", context.Connection.RemoteIpAddress))
using (LogContext.PushProperty("Session", context.Session.GetString("SessionGUID") ?? "Unknown"))
{
await _next.Invoke(context);
}
}
}
在中间件中,我想将一些属性(地址、会话等)推送到日志中。当我如上所述配置 Serilog 时,属性在日志中不可见。当我使用 Program.cs 中的下一个片段配置 Serilog 时,它确实有效:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Override("System", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Hour,outputTemplate: "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}")
.CreateLogger();
为什么会有差异?或者我如何在 via-appsettings-configured-serilog 上使用 PushProperty 可能性?
在Program.cs
中初始化Serilog时只需要添加.Enrich.FromLogContext()
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.CreateLogger();
在 Serilog.AspNetCore 文档中查看 Inline initialization。
ASP.NET Core 2.2.0
| Serilog.AspNetCore 2.1.1
| Serilog.Sinks.File 4.0.0
我正在 Program.cs 中初始化 Serilog,从 appsettings.json 读取配置并在 Startup.cs -> 配置中添加中间件。一些片段:
Program.cs
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseConfiguration(Configuration)
.UseSerilog();
Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() || env.IsStaging())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseRewriter(new RewriteOptions()
.AddRedirectToWww()
.AddRedirectToHttps());
}
app.UseSession();
app.UseAuthentication();
app.UseMiddleware<SerilogAddUserInfo>();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
appsettings.json
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
},
"Enrich": "FromLogContext",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"rollingInterval": "Hour",
"outputTemplate": "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}"
}
}
]
}
SerilogMiddleware.cs
public class SerilogAddUserInfo
{
private readonly RequestDelegate _next;
public SerilogAddUserInfo(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
using (LogContext.PushProperty("Address", context.Connection.RemoteIpAddress))
using (LogContext.PushProperty("Session", context.Session.GetString("SessionGUID") ?? "Unknown"))
{
await _next.Invoke(context);
}
}
}
在中间件中,我想将一些属性(地址、会话等)推送到日志中。当我如上所述配置 Serilog 时,属性在日志中不可见。当我使用 Program.cs 中的下一个片段配置 Serilog 时,它确实有效:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Override("System", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Hour,outputTemplate: "{Timestamp:o} [{Level:u3}] [IP {Address}] [Session {Session}] [{SourceContext}] {Site}: {Message}{NewLine}")
.CreateLogger();
为什么会有差异?或者我如何在 via-appsettings-configured-serilog 上使用 PushProperty 可能性?
在Program.cs
.Enrich.FromLogContext()
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.CreateLogger();
在 Serilog.AspNetCore 文档中查看 Inline initialization。