87 lines
3.9 KiB
C#
87 lines
3.9 KiB
C#
using IRaCIS.Core.Domain.Share;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Serilog.Core;
|
|
using Serilog.Events;
|
|
using System;
|
|
using System.IO;
|
|
using System.Threading.Tasks;
|
|
|
|
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("TokenUserRealName", httpContext?.User?.FindFirst(ClaimAttributes.RealName)?.Value));
|
|
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserType", httpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName)?.Value));
|
|
|
|
|
|
//这样读取没用
|
|
//logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestBody", await ReadRequestBody(httpContext.Request)));
|
|
//logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", IPHelper.GetIP(httpContext.Request) ));
|
|
//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}";
|
|
}
|
|
}
|
|
|
|
}
|