asp.net core mvc接口,请求响应统一日志管理
生活随笔
收集整理的這篇文章主要介紹了
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接口,请求响应统一日志管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: e-s0bic1.exe进程是什么文件的
- 下一篇: eraser.exe进程是什么文件 er