90 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
| 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<LogEvent, ILogEventPropertyFactory, HttpContext> _enrichAction;
 | |
| 
 | |
|         public HttpContextEnricher(IServiceProvider serviceProvider) : this(serviceProvider, null)
 | |
|         { }
 | |
| 
 | |
|         public HttpContextEnricher(IServiceProvider serviceProvider, Action<LogEvent, ILogEventPropertyFactory, HttpContext> enrichAction)
 | |
|         {
 | |
|             _serviceProvider = serviceProvider;
 | |
|             if (enrichAction == null)
 | |
|             {
 | |
|                 _enrichAction =  (logEvent, propertyFactory, httpContext) =>
 | |
|                 {
 | |
|                     logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.Connection.RemoteIpAddress.ToString()));
 | |
| 
 | |
|                     logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("LocalIP", httpContext.Connection.LocalIpAddress.MapToIPv4().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<IHttpContextAccessor>()?.HttpContext;
 | |
|             if (null != httpContext)
 | |
|             {
 | |
|                 _enrichAction.Invoke(logEvent, propertyFactory, httpContext);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private async Task<string> 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<string> 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}";
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 |