我一直在努力使用 serilog 记录响应正文有效负载数据,从中间件记录。我工作的WEB API核心应用,与招摇添加到终点,我的目标是为每一个终点呼叫记录到一个以.json与文件serilog(请求和响应数据)。
对于GET请求,应记录响应正文(作为属性添加到 serilog 上下文),对于 POST 请求,应记录请求正文和响应正文。我创建了中间件并设法从请求和响应流中正确检索数据,并将其作为字符串获取,但只有“RequestBody”被正确记录。
调试时,我可以看到读取请求/响应正文工作正常。
以下是 Program->Main 方法的代码摘录:
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
和中间件中的代码:
public async Task Invoke(HttpContext context)
{
// Read and log request body data
string requestBodyPayload = await ReadRequestBody(context.Request);
LogContext.PushProperty("RequestBody", requestBodyPayload);
// Read and log response body data
var originalBodyStream = context.Response.Body;
using (var responseBody = new MemoryStream())
{
context.Response.Body = responseBody;
await _next(context);
string responseBodyPayload = await …Run Code Online (Sandbox Code Playgroud) serilog asp.net-core asp.net-core-middleware asp.net-core-webapi
大家好我怎样才能得到这个输出
{
"@t": "2020-11-03T16:40:21.6133998Z",
"@m": "HTTP \"POST\" \"/api/Email/SendEmail\" responded 200 in 1.0358 ms",
"@i": "62d0885c",
"CorrelationId": "",
"Host": "localhost:32768",
"Protocol": "HTTP/1.1",
"Scheme": "http",
"ContentType": null,
"EndpointName": "Email.Controllers.EmailController.SendEmail (Email)",
"RequestMethod": "POST",
"RequestPath": "/api/Email/SendEmail",
"StatusCode": 200,
"Elapsed": 1.0358,
"SourceContext": "Serilog.AspNetCore.RequestLoggingMiddleware",
"RequestId": "",
"SpanId": "|55f14a36-4918a3efd4f265b9.",
"TraceId": "55f14a36-4918a3efd4f265b9",
"ParentId": "",
"ConnectionId": "0HM402S7EC249"
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用我的控制器时,我看到并运行应用程序,我看到
这就是我设置 Serilog 的方式,我做错了什么
public class LogConfig
{
public static void Configure()
{
Log.Logger = new LoggerConfiguration()
.WriteTo.Console(new RenderedCompactJsonFormatter())
.CreateLogger();
}
public static void EnrichFromRequest(IDiagnosticContext diagnosticContext, HttpContext httpContext)
{
diagnosticContext.Set("RequestScheme", httpContext.Request.Host.Value); …Run Code Online (Sandbox Code Playgroud)