请求日志
记录请求日志有助于故障排查、性能监控、安全审计、用户行为分析、合规性保障及数据分析,能够快速定位问题、优化系统性能、检测安全威胁、了解用户需求,并支持决策制定,确保系统的稳定性和安全性。
常见参数
请求日志一般需要记录以下参数:请求时间、请求方法(GET/POST等)、请求URL、客户端IP地址、用户代理信息、请求头、请求体(如适用)、响应状态码、响应时间、处理时间、用户ID(如适用)以及错误信息(如有)。这些参数有助于全面分析请求情况和系统性能。
参数 | 描述 |
---|---|
请求方法 | HTTP方法(如GET/POST等) |
请求URL | 请求的资源路径 |
请求体 | 请求的主体内容(如适用) |
响应状态码 | 服务器返回的HTTP状态码 |
响应体 | 响应的主体内容(如适用) |
处理时间 | 请求处理所花费的时间 |
成熟框架
serilog-request-logging
serilog-request-logging用于HTTP请求日志记录的中间件。
ASP.NET Core默认的请求日志记录非常冗杂,每个请求会发出多个事件。所包含的中间件将这些事件浓缩为一个单一事件,携带方法、路径、状态码和时间信息。
JSON格式表示:
{
"@t": "2019-06-26T06:05:54.6881162Z",
"@mt": "HTTP {RequestMethod} {RequestPath} responded {StatusCode} in {Elapsed:0.0000} ms",
"@r": ["224.5185"],
"@tr": "a964e1ecfc989fc7256359d3645a63dc",
"@sp": "59d5e2250cc4a361",
"RequestMethod": "GET",
"RequestPath": "/",
"StatusCode": 200,
"Elapsed": 224.5185,
"RequestId": "0HLNPVG1HI42T:00000001",
"CorrelationId": null,
"ConnectionId": "0HLNPVG1HI42T"
}
- 请求方法
- 请求URL
- 请求体
- 响应状态码
- 响应体
- 处理时间
使用方式:
var app = builder.Build();
app.UseSerilogRequestLogging(); // <-- Add this line
ASP.NET Core 中的 HTTP 日志记录
HTTP 日志记录是一种中间件,用于记录传入 HTTP 请求和 HTTP 响应的相关信息。 HTTP 日志记录可以记录:
- HTTP 请求信息
- 公共属性
- 标头
- 正文
- HTTP 响应信息
HTTP 日志记录可以:
- 记录所有请求和响应,或者仅记录满足特定条件的请求和响应。
- 选择要记录请求和响应的哪些部分。
- 支持修订日志中的敏感信息。
HTTP 日志记录可能会降低应用的性能,尤其是在记录请求和响应正文时。 在选择要记录的字段时请考虑性能影响。 测试所选日志记录属性的性能影响。
JSON格式表示:
{
"@t": "2024-06-22T11:26:36.9058713Z",
"@m": "Request and Response:RequestBody: {\"Msg\":\"World\"}\nRequestBodyStatus: [Completed]\nResponseBody: {\"msg\":\"helloWorld\"}",
"@i": "8b8e65b7",
"@l": "Information",
"@tr": "a964e1ecfc989fc7256359d3645a63dc",
"@sp": "59d5e2250cc4a361",
"RequestBody": "{\"Msg\":\"World\"}",
"RequestBodyStatus": "[Completed]",
"ResponseBody": "{\"msg\":\"helloWorld\"}",
"EventId": {
"Id": 9,
"Name": "RequestResponseLog"
},
"SourceContext": "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware",
"RequestId": "0HN4ILOMR3NSH:00000001",
"RequestPath": "/message",
"ConnectionId": "0HN4ILOMR3NSH"
}
- 请求方法
- 请求URL
- 请求体
- 响应状态码
- 响应体
- 处理时间
使用方式:
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog();
builder.Services.AddHttpLogging(logging =>
{
logging.LoggingFields = HttpLoggingFields.RequestBody | HttpLoggingFields.ResponseBody;
logging.RequestBodyLogLimit = 1024;
logging.ResponseBodyLogLimit = 1024;
logging.CombineLogs = true;
});
var app = builder.Build();
app.UseHttpLogging();
总结
综合两种框架的优势和不足,构建出最佳实践,建议使用Serilog进行结构化日志记录,同时利用ASP.NET Core内置功能捕获全面请求详情,确保关键信息记录且性能影响最小化。