日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

asp.net core mvc接口,请求响应统一日志管理

發布時間:2023/12/10 asp.net 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp.net core mvc接口,请求响应统一日志管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何為api所有的請求和響應做一個統一的日志記錄

1.創建日志類

public class RequestResponseLog {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 $"\r\n***********************************************************************\r\nUrl: {this.Url},\r\nHeaders: {headers},\r\nMethod: {this.Method},\r\nRequestBody: {this.RequestBody},\r\nResponseBody: {this.ResponseBody},\r\nExcuteStartTime: {this.ExcuteStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff")},\r\nExcuteEndTime: {this.ExcuteEndTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}";}}

2.創建日志中間件

public class RequestResponseLoggingMiddleware {private readonly RequestDelegate _next;private RequestResponseLog _logInfo;public RequestResponseLoggingMiddleware(RequestDelegate next){_next = next;}public async Task Invoke(HttpContext context){_logInfo = new RequestResponseLog();HttpRequest request = context.Request;_logInfo.Url = request.Path.ToString();_logInfo.Headers = request.Headers.ToDictionary(k => k.Key, v => string.Join(";", v.Value.ToList()));_logInfo.Method = request.Method;_logInfo.ExcuteStartTime = DateTime.Now;//獲取request.Body內容if (request.Method.ToLower().Equals("post")){//request.EnableRewind(); //啟用倒帶功能,就可以讓 Request.Body 可以再次讀取,.net 5棄用request.EnableBuffering(); Stream stream = request.Body;byte[] buffer = new byte[request.ContentLength.Value];//stream.Read(buffer, 0, buffer.Length); //.net 3.0之后不允許同步讀取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;}//獲取Response.Body內容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;//Log4Net.LogInfo($"VisitLog: {_logInfo.ToString()}");LogA.SaveInfoToTxtFile($"VisitLog: {_logInfo.ToString()}");await responseBody.CopyToAsync(originalBodyStream);}}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 RequestResponseLoggingMiddlewareExtensions {public static IApplicationBuilder UseRequestResponseLogging(this IApplicationBuilder builder){return builder.UseMiddleware<RequestResponseLoggingMiddleware>();} }

3.日志書寫類

public static class LogA {public static void SaveInfoToTxtFile(string info){string bPath = AppContext.BaseDirectory;//如果不存在Log文件夾就創建文件夾if (Directory.Exists(bPath+@".\Log") == false){Directory.CreateDirectory(bPath+@".\Log");}//如果不存在log文件夾下的以年月命名的文件夾就創建file文件夾if (Directory.Exists(bPath+@".\Log\" + DateTime.Now.ToString("yyyyMM")) == false){Directory.CreateDirectory(bPath+@".\Log\" + DateTime.Now.ToString("yyyyMM"));}string fileName = bPath+@".\Log\" + DateTime.Now.ToString("yyyyMM") + "\\" + DateTime.Now.ToString("yyyyMMddHH") + ".txt";StreamWriter sWriter = null;try{sWriter = new StreamWriter(fileName, true, Encoding.Default);sWriter.Write(info);}catch (Exception err){Console.WriteLine("\r\n保存控制臺顯示的信息 出現異常!" + err.Message);}finally{//如果流不為空,關閉它if (sWriter != null)sWriter.Close();}} }

4.在starpup.cs中注冊中間件

app.UseRequestResponseLogging();

5.完成,收工

總結

以上是生活随笔為你收集整理的asp.net core mvc接口,请求响应统一日志管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。