c# - appsettings-configuration 中的 Serilog PushProperty 不起作用
问题描述
ASP.NET Core 2.2.0
| Serilog.AspNetCore 2.1.1
|Serilog.Sinks.File 4.0.0
我在 Program.cs 中初始化 Serilog,从 appsettings.json 读取配置并在 Startup.cs -> Configure 中添加中间件。一些片段:
程序.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();
启动.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();
}
应用设置.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 可能性?
解决方案
只需要.Enrich.FromLogContext()
在初始化 Serilog 时添加Program.cs
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.CreateLogger();
检查Serilog.AspNetCore文档中的内联初始化。
推荐阅读
- python - 当 Pandas DataFrame 中的某个值在另一列中实现时,如何编辑一列中的值?
- python - View 没有返回 HttpResponse 对象。它返回 None 代替。当与 FormView 一起使用正常形式时,django
- java - 属性名称中的 JBoss CLI 特殊字符
- python - 将数据发送到烧瓶而不重新加载页面
- c++ - c++ 项目中令人困惑的定义指令
- java - 休眠搜索将一个实体索引到两个不同的索引
- selenium - Selenium 未通过代理加载页面,显示构建信息:版本:'未知',修订:'未知',时间:'未知'
- c++ - 结构化绑定初始化程序表单 { assignment-expression } 在 clang 上的数组类型失败
- python - 如果 Pandas 数据框中的两个布尔值为真,如何替换元素
- webpack - 运行 webpack encore 时出现语法错误