C# 自定义日志中间件 ASP.NET Core Web API
自定义日志中间件
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FCore.TenFu.WMS.WebAPI { /// <summary> /// 日志中间件 /// </summary> public class APIRequestLogMiddleware { private readonly RequestDelegate _next; /// <summary> /// 构造函数 /// </summary> /// <param name="next"></param> public APIRequestLogMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { try { var logger = context.RequestServices.GetService<ILogger<APIRequestLogMiddleware>>(); LogInfoDTO _logInfo = new LogInfoDTO(); HttpRequest request = context.Request; _logInfo.Url = UriHelper.GetDisplayUrl(request); _logInfo.Headers = request.Headers.ToDictionary(k => k.Key, v => string.Join(";", v.Value.ToList())); _logInfo.Method = request.Method; _logInfo.ExcuteStartTime = DateTime.Now; if (request.Method.ToLower().Equals("post")) { request.EnableBuffering(); Stream stream = request.Body; byte[] buffer = new byte[request.ContentLength.Value]; await stream.ReadAsync(buffer, 0, buffer.Length); _logInfo.RequestBody = Encoding.UTF8.GetString(buffer); request.Body.Position = 0; } else if (request.Method.ToLower().Equals("get")) { _logInfo.RequestBody = request.QueryString.Value; } var originalBodyStream = context.Response.Body; using (var responseBody = new MemoryStream()) { context.Response.Body = responseBody; await _next(context); _logInfo.ResponseBody = await FormatResponse(context.Response); _logInfo.ExcuteEndTime = DateTime.Now; //Serilog.Log.Information(JsonConvert.SerializeObject(_logInfo)); if (_logInfo.Url.ToLower().Contains("/api/pda")) { logger.Log(LogLevel.None, $"{JsonConvert.SerializeObject(_logInfo)}"); } Serilog.Log.Information($"{_logInfo.ToString()}"); await responseBody.CopyToAsync(originalBodyStream); } } catch (Exception ex) { Serilog.Log.Error($"请求中间键错误:{ex.Message}"); } } private async Task<string> FormatResponse(HttpResponse response) { response.Body.Seek(0, SeekOrigin.Begin); var text = await new StreamReader(response.Body).ReadToEndAsync(); response.Body.Seek(0, SeekOrigin.Begin); return text; } } public static class APIRequestLogMiddlewareExtensions { public static IApplicationBuilder UseApiRequestLogging(this IApplicationBuilder builder) { return builder.UseMiddleware<APIRequestLogMiddleware>(); } } /// <summary> /// 日志记录信息 /// </summary> public class LogInfoDTO { public string RequestUniqueId { get; set; } = Guid.NewGuid().ToString("n"); public string Url { get; set; } public IDictionary<string, string> Headers { get; set; } = new Dictionary<string, string>(); public string Method { get; set; } public string RequestBody { get; set; } public string ResponseBody { get; set; } public DateTime ExcuteStartTime { get; set; } public DateTime ExcuteEndTime { get; set; } public override string ToString() { string headers = "[" + string.Join(",", this.Headers.Select(i => "{" + $"\"{i.Key}\":\"{i.Value}\"" + "}")) + "]"; return $"RequestUniqueId: {this.RequestUniqueId},\r\n" + $"Url: {this.Url},\r\n" + $"Headers: {headers},\r\n" + $"Method: {this.Method},\r\n" + $"RequestBody: {this.RequestBody},\r\n" + $"ResponseBody: {this.ResponseBody},\r\n" + $"ExcuteStartTime: {this.ExcuteStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff")},\r\n" + $"ExcuteEndTime: {this.ExcuteEndTime.ToString("yyyy-MM-dd HH:mm:ss.fff")},\r\n" + $"TotalElapsed: {this.TotalElapsed}(ms)"; } public int TotalElapsed { get { return ExcuteEndTime.Subtract(ExcuteStartTime).Milliseconds; } } } }
注入中间件
//注入日志记录中间键 app.UseApiRequestLogging();
无限接近死亡,才能领悟生命的真谛
标签:
ASP.NET Core Web API
, C#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧