using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure.Extention; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Serilog.Core; using Serilog.Events; using System; using System.IO; using System.Text; using System.Threading.Tasks; using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.API { public class HttpContextEnricher : ILogEventEnricher { private readonly IServiceProvider _serviceProvider; private readonly Action _enrichAction; public HttpContextEnricher(IServiceProvider serviceProvider) : this(serviceProvider, null) { } public HttpContextEnricher(IServiceProvider serviceProvider, Action enrichAction) { _serviceProvider = serviceProvider; if (enrichAction == null) { _enrichAction = (logEvent, propertyFactory, httpContext) => { logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.Connection.RemoteIpAddress.ToString())); //这样读取没用 //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestBody", await ReadRequestBody(httpContext.Request))); //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", IPHelper.GetIP(httpContext.Request) )); logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserRealName", httpContext?.User?.FindFirst(ClaimAttributes.RealName)?.Value)); logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserType", httpContext?.User?.FindFirst("userTypeEnumName")?.Value)); //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"].ToString())); //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("request_path", httpContext.Request.Path)); //logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("request_method", httpContext.Request.Method)); //if (httpContext.Response.HasStarted) //{ // logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("response_status", httpContext.Response.StatusCode)); //} }; } else { _enrichAction = enrichAction; } } public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { var httpContext = _serviceProvider.GetService()?.HttpContext; if (null != httpContext) { _enrichAction.Invoke(logEvent, propertyFactory, httpContext); } } private async Task ReadRequestBody(HttpRequest request) { // Ensure the request's body can be read multiple times (for the next middlewares in the pipeline). request.EnableBuffering(); using var streamReader = new StreamReader(request.Body, leaveOpen: true); var requestBody = await streamReader.ReadToEndAsync(); // Reset the request's body stream position for next middleware in the pipeline. request.Body.Position = 0; return requestBody==null?String.Empty: requestBody.Trim(); } private async Task ReadResponseBody(HttpResponse response) { response.Body.Seek(0, SeekOrigin.Begin); string responseBody = await new StreamReader(response.Body).ReadToEndAsync(); response.Body.Seek(0, SeekOrigin.Begin); return $"{responseBody}"; } } }