.NET 6 ASP.NET Core中Serilog日志不显示IP地址问题
解决Serilog JSON日志不显示客户端IP的问题
1. 确认安装必要的NuGet包
确保项目已安装以下包:
Serilog.AspNetCore(提供请求日志中间件)Serilog.Enrichers.ClientInfo(提供客户端IP/UA的enricher)
2. 修正配置文件中的Enrich名称错误
appsettings.json里的"WithClientIP"和"WithClientAgent"大小写不符合Serilog扩展方法的命名规范,需改为驼峰格式:
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId", "WithClientIp", "WithClientAgent" ],
3. 添加Serilog请求日志中间件
在Program.cs的管道配置中,必须在UseRouting()之后、UseAuthorization()之前添加UseSerilogRequestLogging(),这是获取HttpContext中客户端IP的核心步骤:
var builder = WebApplication.CreateBuilder(args); // 你的Serilog配置代码... var app = builder.Build(); app.UseHttpsRedirection(); app.UseRouting(); app.UseSerilogRequestLogging(); // 关键中间件,顺序不能错 app.UseAuthorization(); app.MapControllers(); app.Run();
4. 简化Serilog代码配置(可选)
代码中重复配置了Enrich项,可统一移到配置文件管理,简化后的代码:
var logger = new LoggerConfiguration() .Enrich.FromLogContext() .ReadFrom.Configuration(builder.Configuration) .CreateLogger(); builder.Logging.ClearProviders(); builder.Logging.AddSerilog(logger);
5. 验证日志输出
重启项目后发起请求,查看JSON日志文件,应出现ClientIp和ClientAgent字段:
{ "Timestamp": "2024-05-20T12:34:56.789Z", "Level": "Information", "Message": "HTTP GET /api/values responded 200 in 12.345 ms", "ClientIp": "192.168.1.100", "ClientAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...", // 其他日志字段... }
核心原因说明
Serilog的客户端IP enricher依赖当前请求的HttpContext,UseSerilogRequestLogging()中间件负责将HttpContext中的信息注入日志上下文;同时配置文件中Enrich名称的大小写错误会导致enricher未被正确加载,这两个问题共同导致IP地址无法显示。
内容的提问来源于stack exchange,提问作者Tom Kurian
相关产品推荐
相关产品推荐

