FastGithub/FastGithub.ReverseProxy/RequestLoggingMilldeware.cs
2021-09-06 15:13:29 +08:00

84 lines
2.4 KiB
C#

using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading.Tasks;
namespace FastGithub.ReverseProxy
{
/// <summary>
/// 请求日志中间件
/// </summary>
sealed class RequestLoggingMiddleware
{
private readonly ILogger<RequestLoggingMiddleware> logger;
/// <summary>
/// 请求日志中间件
/// </summary>
/// <param name="logger"></param>
public RequestLoggingMiddleware(ILogger<RequestLoggingMiddleware> logger)
{
this.logger = logger;
}
/// <summary>
/// 执行请求
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var stopwatch = Stopwatch.StartNew();
try
{
await next(context);
}
finally
{
stopwatch.Stop();
}
var request = context.Request;
var response = context.Response;
var message = $"{request.Method} {request.Scheme}://{request.Host}{request.Path} responded {response.StatusCode} in {stopwatch.Elapsed.TotalMilliseconds} ms";
var client = context.Connection.RemoteIpAddress;
if (IPAddress.Loopback.Equals(client) == false)
{
message = $"{client} {message}";
}
var exception = context.GetForwarderErrorFeature()?.Exception;
if (IsError(exception) == false)
{
this.logger.LogInformation(message);
}
else
{
this.logger.LogError($"{message}{Environment.NewLine}{exception}");
}
}
private static bool IsError(Exception? exception)
{
if (exception == null || exception is OperationCanceledException)
{
return false;
}
if (exception is IOException ioException && ioException.InnerException is ConnectionAbortedException)
{
return false;
}
return true;
}
}
}