在请求WebApi 的时候,我们更想知道在请求数据的时候,调用了哪个接口传了什么参数过来,调用这个Action花了多少时间,有没有人恶意请求。我们可以通过记录日志,对Action进行优化,可以通过日志追踪是哪个用户或ip恶意请求。

在项目中引用log4net.dll

定义一个WebApiMonitorLog ,监控日志对象

  1. /// <summary>
  2. /// 监控日志对象
  3. /// </summary>
  4. public class WebApiMonitorLog
  5. {
  6. public string ControllerName { get; set; }
  7. public string ActionName { get; set; }
  8.  
  9. public DateTime ExecuteStartTime { get; set; }
  10. public DateTime ExecuteEndTime { get; set; }
  11.  
  12. /// <summary>
  13. /// 请求的Action 参数
  14. /// </summary>
  15. public Dictionary<string, object> ActionParams { get; set; }
  16.  
  17. /// <summary>
  18. /// Http请求头
  19. /// </summary>
  20. public string HttpRequestHeaders { get; set; }
  21.  
  22. /// <summary>
  23. /// 请求方式
  24. /// </summary>
  25. public string HttpMethod { get; set; }
  26.  
  27. /// <summary>
  28. /// 请求的IP地址
  29. /// </summary>
  30. public string IP { get; set; }
  31.  
  32. /// <summary>
  33. /// 获取监控指标日志
  34. /// </summary>
  35. /// <param name="mtype"></param>
  36. /// <returns></returns>
  37. public string GetLoginfo()
  38. {
  39. string Msg = @"
  40. Action执行时间监控:
  41. ControllerName:{0}Controller
  42. ActionName:{1}
  43. 开始时间:{2}
  44. 结束时间:{3}
  45. 总 时 间:{4}秒
  46. Action参数:{5}
  47. Http请求头:{6}
  48. 客户端IP:{7},
  49. HttpMethod:{8}
  50. ";
  51. return string.Format(Msg,
  52. ControllerName,
  53. ActionName,
  54. ExecuteStartTime,
  55. ExecuteEndTime,
  56. (ExecuteEndTime - ExecuteStartTime).TotalSeconds,
  57. GetCollections(ActionParams),
  58. HttpRequestHeaders,
  59. IP,
  60. HttpMethod);
  61. }
  62.  
  63. /// <summary>
  64. /// 获取Action 参数
  65. /// </summary>
  66. /// <param name="Collections"></param>
  67. /// <returns></returns>
  68. public string GetCollections(Dictionary<string, object> Collections)
  69. {
  70. string Parameters = string.Empty;
  71. if (Collections == null || Collections.Count == )
  72. {
  73. return Parameters;
  74. }
  75. foreach (string key in Collections.Keys)
  76. {
  77. Parameters += string.Format("{0}={1}&", key, Collections[key]);
  78. }
  79. if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith("&"))
  80. {
  81. Parameters = Parameters.Substring(, Parameters.Length - );
  82. }
  83. return Parameters;
  84. }
  85.  
  86. /// <summary>
  87. /// 获取IP
  88. /// </summary>
  89. /// <returns></returns>
  90. public string GetIP()
  91. {
  92. string ip = string.Empty;
  93. if (!string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"]))
  94. ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);
  95. if (string.IsNullOrEmpty(ip))
  96. ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]);
  97. return ip;
  98. }
  99. }

WebApiMonitorLog

定义一个LoggerHelper,日志帮助类

  1. public class LoggerHelper
  2. {
  3. private static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
  4. private static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
  5. private static readonly log4net.ILog logmonitor = log4net.LogManager.GetLogger("logmonitor");
  6.  
  7. public static void Error(string ErrorMsg, Exception ex = null)
  8. {
  9. if (ex != null)
  10. {
  11. logerror.Error(ErrorMsg, ex);
  12. }
  13. else
  14. {
  15. logerror.Error(ErrorMsg);
  16. }
  17. }
  18.  
  19. public static void Info(string Msg)
  20. {
  21. loginfo.Info(Msg);
  22. }
  23.  
  24. public static void Monitor(string Msg)
  25. {
  26. logmonitor.Info(Msg);
  27. }
  28. }

LoggerHelper

定义一个WebApiTrackerAttribute类,继承于ActionFilterAttribute

  1. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
  2. public class WebApiTrackerAttribute : ActionFilterAttribute
  3. {
  4. private readonly string Key = "_thisWebApiOnActionMonitorLog_";
  5. public override void OnActionExecuting(HttpActionContext actionContext) {
  6. base.OnActionExecuting(actionContext);
  7. WebApiMonitorLog MonLog = new WebApiMonitorLog();
  8. MonLog.ExecuteStartTime = DateTime.Now;
  9. //获取Action 参数
  10. MonLog.ActionParams = actionContext.ActionArguments;
  11. MonLog.HttpRequestHeaders = actionContext.Request.Headers.ToString();
  12. MonLog.HttpMethod = actionContext.Request.Method.Method;
  13.  
  14. actionContext.Request.Properties[Key] = MonLog;
  15. var form = System.Web.HttpContext.Current.Request.Form;
  16. #region 如果参数是实体对象,获取序列化后的数据
  17. Stream stream = actionContext.Request.Content.ReadAsStreamAsync().Result;
  18. Encoding encoding = Encoding.UTF8;
  19. stream.Position = ;
  20. string responseData = "";
  21. using (StreamReader reader = new StreamReader(stream, encoding)) {
  22. responseData = reader.ReadToEnd().ToString();
  23. }
  24. if (!string.IsNullOrWhiteSpace(responseData) && !MonLog.ActionParams.ContainsKey("__EntityParamsList__")) {
  25. MonLog.ActionParams["__EntityParamsList__"] = responseData;
  26. }
  27. #endregion
  28. }
  29.  
  30. public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
  31. WebApiMonitorLog MonLog = actionExecutedContext.Request.Properties[Key] as WebApiMonitorLog;
  32. MonLog.ExecuteEndTime = DateTime.Now;
  33. MonLog.ActionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
  34. MonLog.ControllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
  35. LoggerHelper.Monitor(MonLog.GetLoginfo());
  36. if (actionExecutedContext.Exception != null) {
  37. string Msg = string.Format(@"
  38. 请求【{0}Controller】的【{1}】产生异常:
  39. Action参数:{2}
  40. Http请求头:{3}
  41. 客户端IP:{4},
  42. HttpMethod:{5}
  43. ", MonLog.ControllerName, MonLog.ActionName, MonLog.GetCollections(MonLog.ActionParams), MonLog.HttpRequestHeaders, MonLog.GetIP(), MonLog.HttpMethod);
  44. LoggerHelper.Error(Msg, actionExecutedContext.Exception);
  45. }
  46. }
  47. }

WebApiTrackerAttribute

新建一个log4net.config

  1. <?xml version="1.0"?>
  2. <configuration>
  3. <configSections>
  4. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  5. </configSections>
  6. <log4net>
  7. <!--错误日志-->
  8. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  9. <file value="log\\LogError\\"/>
  10. <appendToFile value="true"/>
  11. <rollingStyle value="Date"/>
  12. <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
  13. <staticLogFileName value="false"/>
  14. <param name="MaxSizeRollBackups" value=""/>
  15. <layout type="log4net.Layout.PatternLayout">
  16. <!--每条日志末尾的文字说明-->
  17. <!--输出格式-->
  18. <!--样例:-- ::, [] INFO Log4NetDemo.MainClass [(null)] - info-->
  19. <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>
  20. </layout>
  21. </appender>
  22. <!--Info日志-->
  23. <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
  24. <param name="File" value="Log\\LogInfo\\" />
  25. <param name="AppendToFile" value="true" />
  26. <param name="MaxFileSize" value="" />
  27. <param name="MaxSizeRollBackups" value="" />
  28. <param name="StaticLogFileName" value="false" />
  29. <param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
  30. <param name="RollingStyle" value="Date" />
  31. <layout type="log4net.Layout.PatternLayout">
  32. <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n"/>
  33. </layout>
  34. </appender>
  35.  
  36. <!--监控日志-->
  37. <appender name="MonitorAppender" type="log4net.Appender.RollingFileAppender">
  38. <param name="File" value="Log\\LogMonitor\\" />
  39. <param name="AppendToFile" value="true" />
  40. <param name="MaxFileSize" value="" />
  41. <param name="MaxSizeRollBackups" value="" />
  42. <param name="StaticLogFileName" value="false" />
  43. <param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
  44. <param name="RollingStyle" value="Date" />
  45. <layout type="log4net.Layout.PatternLayout">
  46. <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n跟踪描述:%message%newline %n"/>
  47. </layout>
  48. </appender>
  49. <!--Error日志-->
  50. <logger name="logerror">
  51. <level value="ERROR" />
  52. <appender-ref ref="RollingLogFileAppender" />
  53. </logger>
  54. <!--Info日志-->
  55. <logger name="loginfo">
  56. <level value="INFO" />
  57. <appender-ref ref="InfoAppender" />
  58. </logger>
  59. <!--监控日志-->
  60. <logger name="logmonitor">
  61. <level value="Monitor" />
  62. <appender-ref ref="MonitorAppender" />
  63. </logger>
  64. </log4net>
  65. </configuration>

log4net.config

然后引用监控,在Global.asax 里加上这段

  1. GlobalConfiguration.Configuration.Filters.Add(new WebApiTrackerAttribute());
  2. AreaRegistration.RegisterAllAreas();

最后在需要监控的控制器上加上 WebApiTracker

每次在调用这个监控下的Action 时,都会有日志记录,像这样滴

在项目下有个log 文件夹

日志记录

参考于:http://www.cnblogs.com/lc-chenlong/p/4228639.html  log4net 记录MVC监控日志

感谢感谢!!

此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。

如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。

2017-11 代码及数据库文件已经上传至 https://github.com/huangenai/WebAPI

学习总结 之 WebApi服务监控 log4net记录监控日志的更多相关文章

  1. C# 使用Log4Net记录程序日志

    在之前的博客中,写过使用系统内置的Trace类记录程序日志,具体请参考:C# 使用Trace记录程序日志.这篇博客将介绍如何使用Log4Net记录程序日志. 首先需要引用Log4Net.dll,我们可 ...

  2. C#中四步轻松使用log4net记录本地日志

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...

  3. C#中四步轻松使用log4net记录本地日志(WPF有点小区别)

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...

  4. ASP.NET MVC中Log4Net记录错误日志的使用

    第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...

  5. WebForm应用log4net记录错误日志——使用线程列队写入

    我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...

  6. 在ASP.NET MVC中使用Log4Net记录异常日志,出错时导向到静态页

    本篇体验在ASP.NET MVC 4中使用Log4Net记录日志. 通过NuGet安装Log4Net. 需求是:当出错时导向到Error.html静态页面,Log4Net记录错误信息. 大致的思路是: ...

  7. log4net记录系统错误日志到文本文件用法详解(最新)

    此配置文件可以直接拿来用,配置文件上面有详细用法说明,里面也有详细注释说明.此配置文件涵盖按照日期记录和按照文件大小(建议)的实例. 又包括:按照Fatal.Info.Error.Debug.Warn ...

  8. log4net记录系统错误日志到文本文件用法详解

    log4net是一个完全免费开源的插件,可以去官网下载源码. 一般系统操作日志不会用log4net,自己写代码存入数据库更方便合理,但是系统部署后运行在客户环境,难免会发生系统bug.崩溃.断网等无法 ...

  9. OpenLayers 6 学习笔记2 WMS服务避坑记录

    心血来潮,花1小时安装软件写代码+复习api,顺便熟悉一波wms 再次强化认知了wms获取要素的能力没有wfs强,有待考究 原文链接(转载请声明@秋意正寒  博客园/知乎/B站/csdn/小专栏):h ...

随机推荐

  1. 通往全栈工程师的捷径 —— react

    腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...

  2. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  3. npm package.json属性详解

    概述 本文档是自己看官方文档的理解+翻译,内容是package.json配置里边的属性含义.package.json必须是一个严格的json文件,而不仅仅是js里边的一个对象.其中很多属性可以通过np ...

  4. gitHub使用入门和github for windows的安装教程

    在看这篇教程之前我想大家也在搜索怎样使用gitHub托管自己的项目,在使用gitHub之前我也遇到过各种问题,在网上我也搜索了很多,但总觉得网上搜索到的东西很多很杂,有的根本不知道是在表达什么.在这过 ...

  5. 简记用ArcGIS处理某项目需求中数据的步骤

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目需求涉及如下几个步骤: a.矢量化 b.获取范围内要素 ...

  6. C#中Length和Count的区别(个人观点)

    这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...

  7. 如何优化coding

    如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码.如果代码写的好的,不用debug就可以一眼看出来哪里出了问题.实际上,我都要deb ...

  8. 推荐一个ASP.NET网站内容管理系统源码

    许多人都有各自的兴趣,如打球.踢毽子.看书.看电视.玩游戏等等....我近来迷上了猜灯谜,于是业余做了一个在线猜灯谜的网站:何问起谜语. 先出个谜语让你猜猜:不可缺一点(打一字).可以在线猜:http ...

  9. C# Entity Framework并发处理

    原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...

  10. SuperMap-iServer-单点登录功能验证(CAS)

    SuperMap-iServer-单点登录功能验证(CAS) 1.测试目的: 验证SuperMap-iServer使用CAS单点登录的功能是否正常. 2.测试环境: SuperMap-iServer8 ...