c# - Serilog LogContext.PushProperty 不工作
问题描述
我在 Program.cs 中初始化 Serilog,从 appsettings.json 读取配置,在 Startup.cs -> 配置和使用请求中间件中添加中间件。一些片段:
启动扩展
public static void UseSerilogRequestMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<RequestMiddleware>();
app.UseSerilogRequestLogging();
}
创建记录器
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.WriteTo.UDPSink(configuration["Serilog:LogstashUrl"], int.Parse(configuration["Serilog:LogstashPort"]), new JsonFormatter())
.CreateLogger();
中间件
public async Task InvokeAsync(HttpContext httpContext)
{
if (httpContext == null) throw new ArgumentNullException(nameof(httpContext));
try
{
using (LogContext.PushProperty("CorrelationId", httpContext.GetCorrelationId()))
using (LogContext.PushProperty("UserName", httpContext.Request.Headers["UserName"]))
using (LogContext.PushProperty("Path", httpContext.Request.Path))
using (LogContext.PushProperty("QueryString", httpContext.Request.Query))
{
await _next(httpContext).ConfigureAwait(false);
}
}
catch (Exception ex)
{
await HandleExceptionAsync(httpContext, ex).ConfigureAwait(false);
}
}
应用设置
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"WriteTo": [ { "Name": "Console" } ],
"Enrich": [ "FromLogContext", "WithMachineName", "WithExceptionDetails" ],
"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "RequestPath like '/health%'"
}
},
{
"Name": "ByExcluding",
"Args": {
"expression": "RequestPath like '/swagger%'"
}
}
],
"LogstashUrl": "logstash-teste-log",
"LogstashPort": "5045"
}
在中间件中,我想将一些属性推送到日志中。当我按照上面所写的方式配置 Serilog 时,属性在日志中不可见
解决方案
推荐阅读
- sql - 在 asp.net 应用程序中打开 .mdf 数据库时出错
- c++ - Ubuntu,如何找到内核工作繁重的程序热点?kernel.kallsyms 中的函数似乎没有标记为用户空间函数的子函数
- python - 导入还是不导入classmethod?
- r - 仅更改基于数据表的特定列名
- python - 尝试在 Debian 9 中使用 pyperclip.copy() 时出现 Python / GTK 错误
- c# - C#循环遍历名称列表并在每次循环时在不同的标签上显示名称
- c# - 参考 - 包括 SQLCLRTYPES 作为参考
- python - Pandas 数据框每天重新采样和计数事件
- visual-c++ - 在移位运算符和数学运算符之间交换
- javascript - 从 apk 文件中提取图标和应用程序名称