成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧用ActionFilterAttribute實(shí)現(xiàn)API日志的記錄

開發(fā) 前端
使用Func 委托實(shí)現(xiàn)API日志的記錄,這次我們使用另外一種方式,F(xiàn)ilter來記錄輸入輸出日志。

[[381754]]

 本文轉(zhuǎn)載自微信公眾號(hào)「UP技術(shù)控」,作者conan5566。轉(zhuǎn)載本文請(qǐng)聯(lián)系UP技術(shù)控公眾號(hào)。  

背景

上回提到開發(fā)web api的時(shí)候,一般是需要記錄api的輸入輸出信息,方便后續(xù)排查問題;使用的是委托的形式進(jìn)行記錄日志。

使用Func

這次我們使用另外一種方式,F(xiàn)ilter來記錄輸入輸出日志。

實(shí)現(xiàn)方式

1、首先在進(jìn)入action的時(shí)候,定義OnActionExecuting。

  1. public override void OnActionExecuting(ActionExecutingContext context) 
  2.         { 
  3.             base.OnActionExecuting(context); 
  4.  
  5.             // 后續(xù)添加了獲取請(qǐng)求的請(qǐng)求體,如果在實(shí)際項(xiàng)目中不需要?jiǎng)h除即可 
  6.             long contentLen = context.HttpContext.Request.ContentLength == null ? 0 : context.HttpContext.Request.ContentLength.Value; 
  7.             if (contentLen > 0) 
  8.             { 
  9.                 // 讀取請(qǐng)求體中所有內(nèi)容 
  10.                 System.IO.Stream stream = context.HttpContext.Request.Body; 
  11.                 if (context.HttpContext.Request.Method == "POST"
  12.                 { 
  13.                     stream.Position = 0; 
  14.                 } 
  15.                 byte[] buffer = new byte[contentLen]; 
  16.                 stream.Read(buffer, 0, buffer.Length); 
  17.                 // 轉(zhuǎn)化為字符串 
  18.                 RequestBody = System.Text.Encoding.UTF8.GetString(buffer); 
  19.             } 
  20.  
  21.             ActionArguments = Newtonsoft.Json.JsonConvert.SerializeObject(context.ActionArguments); 
  22.  
  23.             Stopwatch = new Stopwatch(); 
  24.             Stopwatch.Start(); 
  25.         } 

2、定義Stopwatch ,計(jì)算方法的耗時(shí)。

 

 

  1. private string ActionArguments { get; set; } 
  2.  
  3.         /// <summary> 
  4.         /// 請(qǐng)求體中的所有值 
  5.         /// </summary> 
  6.         private string RequestBody { get; set; } 
  7.  
  8.         private Stopwatch Stopwatch { get; set; } 

3、結(jié)束的時(shí)候,把信息打印出來OnActionExecuted。

  1. public override void OnActionExecuted(ActionExecutedContext context) 
  2.         { 
  3.             base.OnActionExecuted(context); 
  4.             Stopwatch.Stop(); 
  5.  
  6.             string url = context.HttpContext.Request.Host + context.HttpContext.Request.Path + context.HttpContext.Request.QueryString; 
  7.             string method = context.HttpContext.Request.Method; 
  8.             string controller = context.Controller.ToString(); 
  9.             string action = context.ActionDescriptor.DisplayName; 
  10.             string token = ""
  11.             if (context.HttpContext.Request != null && context.HttpContext.Request.Headers != null && context.HttpContext.Request.Headers["Authorization"].Count > 0) 
  12.             { 
  13.                 token = context.HttpContext.Request.Headers["Authorization"]; 
  14.             } 
  15.             string qs = ActionArguments; 
  16.             dynamic result = context?.Result?.GetType()?.Name == "EmptyResult" ? new { Value = "無返回結(jié)果" } : context?.Result as dynamic
  17.  
  18.             string res = "在返回結(jié)果前發(fā)生了異常"
  19.             try 
  20.             { 
  21.                 if (result != null
  22.                 { 
  23.                     res = Newtonsoft.Json.JsonConvert.SerializeObject(result.Value); 
  24.                 } 
  25.             } 
  26.             catch (System.Exception) 
  27.             { 
  28.                 res = "日志未獲取到結(jié)果,返回的數(shù)據(jù)無法序列化"
  29.             } 
  30.  
  31.             NLogger.Info( 
  32.                 $"地址:{url} \n " + 
  33.                   $"controller:{controller} \n " + 
  34.                     $"action:{action} \n " + 
  35.                       $"token:{token} \n " + 
  36.                 $"方式:{method} \n " + 
  37.                 $"請(qǐng)求體:{RequestBody} \n " + 
  38.                 $"參數(shù):{qs}\n " + 
  39.                 $"結(jié)果:{res}\n " + 
  40.                 $"耗時(shí):{Stopwatch.Elapsed.TotalMilliseconds} 毫秒(指控制器內(nèi)對(duì)應(yīng)方法執(zhí)行完畢的時(shí)間)"); 
  41.         } 

4、控制器調(diào)用LogAttribute。

  1. /// <summary> 
  2.     /// 
  3.     /// </summary> 
  4.     [Produces("application/json")] 
  5.     [LogAttribute] 
  6.     [CustomExceptionFilterAttribute] 
  7.     public class DefaultController : Controller 
  8.     { 
  9.     } 

 

 

完整代碼



  1. using CompanyName.ProjectName.Core; 
  2. using Microsoft.AspNetCore.Mvc.Filters; 
  3. using System.Diagnostics; 
  4.  
  5. namespace CompanyName.ProjectName.HttpApi.Host.Code 
  6.     /// <summary> 
  7.     /// 攔截器 
  8.     /// </summary> 
  9.     public class LogAttribute : ActionFilterAttribute 
  10.     { 
  11.         private string ActionArguments { get; set; } 
  12.  
  13.         /// <summary> 
  14.         /// 請(qǐng)求體中的所有值 
  15.         /// </summary> 
  16.         private string RequestBody { get; set; } 
  17.  
  18.         private Stopwatch Stopwatch { get; set; } 
  19.  
  20.         /// <summary> 
  21.         /// 
  22.         /// </summary> 
  23.         /// <param name="context"></param> 
  24.         public override void OnActionExecuting(ActionExecutingContext context) 
  25.         { 
  26.             base.OnActionExecuting(context); 
  27.  
  28.             // 后續(xù)添加了獲取請(qǐng)求的請(qǐng)求體,如果在實(shí)際項(xiàng)目中不需要?jiǎng)h除即可 
  29.             long contentLen = context.HttpContext.Request.ContentLength == null ? 0 : context.HttpContext.Request.ContentLength.Value; 
  30.             if (contentLen > 0) 
  31.             { 
  32.                 // 讀取請(qǐng)求體中所有內(nèi)容 
  33.                 System.IO.Stream stream = context.HttpContext.Request.Body; 
  34.                 if (context.HttpContext.Request.Method == "POST"
  35.                 { 
  36.                     stream.Position = 0; 
  37.                 } 
  38.                 byte[] buffer = new byte[contentLen]; 
  39.                 stream.Read(buffer, 0, buffer.Length); 
  40.                 // 轉(zhuǎn)化為字符串 
  41.                 RequestBody = System.Text.Encoding.UTF8.GetString(buffer); 
  42.             } 
  43.  
  44.             ActionArguments = Newtonsoft.Json.JsonConvert.SerializeObject(context.ActionArguments); 
  45.  
  46.             Stopwatch = new Stopwatch(); 
  47.             Stopwatch.Start(); 
  48.         } 
  49.  
  50.         /// <summary> 
  51.         /// 
  52.         /// </summary> 
  53.         /// <param name="context"></param> 
  54.         public override void OnActionExecuted(ActionExecutedContext context) 
  55.         { 
  56.             base.OnActionExecuted(context); 
  57.             Stopwatch.Stop(); 
  58.  
  59.             string url = context.HttpContext.Request.Host + context.HttpContext.Request.Path + context.HttpContext.Request.QueryString; 
  60.             string method = context.HttpContext.Request.Method; 
  61.             string controller = context.Controller.ToString(); 
  62.             string action = context.ActionDescriptor.DisplayName; 
  63.             string token = ""
  64.             if (context.HttpContext.Request != null && context.HttpContext.Request.Headers != null && context.HttpContext.Request.Headers["Authorization"].Count > 0) 
  65.             { 
  66.                 token = context.HttpContext.Request.Headers["Authorization"]; 
  67.             } 
  68.             string qs = ActionArguments; 
  69.             dynamic result = context?.Result?.GetType()?.Name == "EmptyResult" ? new { Value = "無返回結(jié)果" } : context?.Result as dynamic
  70.  
  71.             string res = "在返回結(jié)果前發(fā)生了異常"
  72.             try 
  73.             { 
  74.                 if (result != null
  75.                 { 
  76.                     res = Newtonsoft.Json.JsonConvert.SerializeObject(result.Value); 
  77.                 } 
  78.             } 
  79.             catch (System.Exception) 
  80.             { 
  81.                 res = "日志未獲取到結(jié)果,返回的數(shù)據(jù)無法序列化"
  82.             } 
  83.  
  84.             NLogger.Info( 
  85.                 $"地址:{url} \n " + 
  86.                   $"controller:{controller} \n " + 
  87.                     $"action:{action} \n " + 
  88.                       $"token:{token} \n " + 
  89.                 $"方式:{method} \n " + 
  90.                 $"請(qǐng)求體:{RequestBody} \n " + 
  91.                 $"參數(shù):{qs}\n " + 
  92.                 $"結(jié)果:{res}\n " + 
  93.                 $"耗時(shí):{Stopwatch.Elapsed.TotalMilliseconds} 毫秒(指控制器內(nèi)對(duì)應(yīng)方法執(zhí)行完畢的時(shí)間)"); 
  94.         } 
  95.     } 

 

責(zé)任編輯:武曉燕 來源: UP技術(shù)控
相關(guān)推薦

2021-02-03 05:24:44

API日志

2021-02-01 00:04:13

Dictionary數(shù)據(jù)批量

2024-10-22 08:47:03

2023-03-10 08:59:30

2010-09-25 16:17:25

SQL語句

2024-12-18 12:10:00

2021-11-17 09:00:00

Kubernetes集群容器

2024-08-26 08:27:18

2011-09-23 10:53:09

2023-05-26 07:08:05

CSS模糊實(shí)現(xiàn)文字

2025-04-01 08:20:00

Logging模塊Python日志記錄

2024-10-06 13:49:30

2022-02-08 17:07:54

Spring BooSpring Aop日志記錄

2010-11-18 13:40:48

mysql分頁查詢

2021-11-03 17:10:37

CSS sticky前端代碼

2024-09-09 15:24:26

Redis開發(fā)

2024-12-23 13:31:38

2011-11-21 15:44:46

管理服務(wù)器日志

2022-01-28 09:01:49

架構(gòu)

2020-12-24 08:37:41

Css前端加載動(dòng)畫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲国产第一页 | 国产精品久久久久久久久久久免费看 | 久久精品亚洲精品国产欧美 | 亚洲成人午夜电影 | 青青久久久 | 一区二区三区在线免费观看 | 欧美日韩高清一区二区三区 | 久草久草久草 | 91精品国产91久久久 | 亚洲人成在线观看 | 亚洲一区二区在线电影 | 日本午夜免费福利视频 | 91精品久久久久久久久 | 色姑娘av| 狠狠操av| 一区二区三区精品视频 | 欧美精品一区在线发布 | 色www精品视频在线观看 | 久久高清免费视频 | 亚洲国产成人精品女人久久久 | 亚洲精品一区国语对白 | 日本精品久久久久久久 | 看片地址| 久久免费看| 欧美成人一区二区三区片免费 | 操久久 | 中文字幕一区二区三区日韩精品 | 亚洲第一区久久 | 国产欧美精品一区二区色综合朱莉 | 福利网址| 国产精品视频一区二区三 | 国产成人精品a视频一区www | 久久久夜色精品亚洲 | 日韩精品在线一区 | 日本aa毛片a级毛片免费观看 | 99视频在线免费观看 | 欧美日日 | 日本在线视| 中文字幕av亚洲精品一部二部 | 国产精品免费高清 | 丁香五月网久久综合 |