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}";
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
}
 |