学习总结 之 WebApi服务监控 log4net记录监控日志
在请求WebApi 的时候,我们更想知道在请求数据的时候,调用了哪个接口传了什么参数过来,调用这个Action花了多少时间,有没有人恶意请求。我们可以通过记录日志,对Action进行优化,可以通过日志追踪是哪个用户或ip恶意请求。
在项目中引用log4net.dll
定义一个WebApiMonitorLog ,监控日志对象
- /// <summary>
- /// 监控日志对象
- /// </summary>
- public class WebApiMonitorLog
- {
- public string ControllerName { get; set; }
- public string ActionName { get; set; }
- public DateTime ExecuteStartTime { get; set; }
- public DateTime ExecuteEndTime { get; set; }
- /// <summary>
- /// 请求的Action 参数
- /// </summary>
- public Dictionary<string, object> ActionParams { get; set; }
- /// <summary>
- /// Http请求头
- /// </summary>
- public string HttpRequestHeaders { get; set; }
- /// <summary>
- /// 请求方式
- /// </summary>
- public string HttpMethod { get; set; }
- /// <summary>
- /// 请求的IP地址
- /// </summary>
- public string IP { get; set; }
- /// <summary>
- /// 获取监控指标日志
- /// </summary>
- /// <param name="mtype"></param>
- /// <returns></returns>
- public string GetLoginfo()
- {
- string Msg = @"
- Action执行时间监控:
- ControllerName:{0}Controller
- ActionName:{1}
- 开始时间:{2}
- 结束时间:{3}
- 总 时 间:{4}秒
- Action参数:{5}
- Http请求头:{6}
- 客户端IP:{7},
- HttpMethod:{8}
- ";
- return string.Format(Msg,
- ControllerName,
- ActionName,
- ExecuteStartTime,
- ExecuteEndTime,
- (ExecuteEndTime - ExecuteStartTime).TotalSeconds,
- GetCollections(ActionParams),
- HttpRequestHeaders,
- IP,
- HttpMethod);
- }
- /// <summary>
- /// 获取Action 参数
- /// </summary>
- /// <param name="Collections"></param>
- /// <returns></returns>
- public string GetCollections(Dictionary<string, object> Collections)
- {
- string Parameters = string.Empty;
- if (Collections == null || Collections.Count == )
- {
- return Parameters;
- }
- foreach (string key in Collections.Keys)
- {
- Parameters += string.Format("{0}={1}&", key, Collections[key]);
- }
- if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith("&"))
- {
- Parameters = Parameters.Substring(, Parameters.Length - );
- }
- return Parameters;
- }
- /// <summary>
- /// 获取IP
- /// </summary>
- /// <returns></returns>
- public string GetIP()
- {
- string ip = string.Empty;
- if (!string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"]))
- ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);
- if (string.IsNullOrEmpty(ip))
- ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]);
- return ip;
- }
- }
WebApiMonitorLog
定义一个LoggerHelper,日志帮助类
- public class LoggerHelper
- {
- private static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
- private static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
- private static readonly log4net.ILog logmonitor = log4net.LogManager.GetLogger("logmonitor");
- public static void Error(string ErrorMsg, Exception ex = null)
- {
- if (ex != null)
- {
- logerror.Error(ErrorMsg, ex);
- }
- else
- {
- logerror.Error(ErrorMsg);
- }
- }
- public static void Info(string Msg)
- {
- loginfo.Info(Msg);
- }
- public static void Monitor(string Msg)
- {
- logmonitor.Info(Msg);
- }
- }
LoggerHelper
定义一个WebApiTrackerAttribute类,继承于ActionFilterAttribute
- [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
- public class WebApiTrackerAttribute : ActionFilterAttribute
- {
- private readonly string Key = "_thisWebApiOnActionMonitorLog_";
- public override void OnActionExecuting(HttpActionContext actionContext) {
- base.OnActionExecuting(actionContext);
- WebApiMonitorLog MonLog = new WebApiMonitorLog();
- MonLog.ExecuteStartTime = DateTime.Now;
- //获取Action 参数
- MonLog.ActionParams = actionContext.ActionArguments;
- MonLog.HttpRequestHeaders = actionContext.Request.Headers.ToString();
- MonLog.HttpMethod = actionContext.Request.Method.Method;
- actionContext.Request.Properties[Key] = MonLog;
- var form = System.Web.HttpContext.Current.Request.Form;
- #region 如果参数是实体对象,获取序列化后的数据
- Stream stream = actionContext.Request.Content.ReadAsStreamAsync().Result;
- Encoding encoding = Encoding.UTF8;
- stream.Position = ;
- string responseData = "";
- using (StreamReader reader = new StreamReader(stream, encoding)) {
- responseData = reader.ReadToEnd().ToString();
- }
- if (!string.IsNullOrWhiteSpace(responseData) && !MonLog.ActionParams.ContainsKey("__EntityParamsList__")) {
- MonLog.ActionParams["__EntityParamsList__"] = responseData;
- }
- #endregion
- }
- public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
- WebApiMonitorLog MonLog = actionExecutedContext.Request.Properties[Key] as WebApiMonitorLog;
- MonLog.ExecuteEndTime = DateTime.Now;
- MonLog.ActionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
- MonLog.ControllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
- LoggerHelper.Monitor(MonLog.GetLoginfo());
- if (actionExecutedContext.Exception != null) {
- string Msg = string.Format(@"
- 请求【{0}Controller】的【{1}】产生异常:
- Action参数:{2}
- Http请求头:{3}
- 客户端IP:{4},
- HttpMethod:{5}
- ", MonLog.ControllerName, MonLog.ActionName, MonLog.GetCollections(MonLog.ActionParams), MonLog.HttpRequestHeaders, MonLog.GetIP(), MonLog.HttpMethod);
- LoggerHelper.Error(Msg, actionExecutedContext.Exception);
- }
- }
- }
WebApiTrackerAttribute
新建一个log4net.config
- <?xml version="1.0"?>
- <configuration>
- <configSections>
- <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
- </configSections>
- <log4net>
- <!--错误日志-->
- <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
- <file value="log\\LogError\\"/>
- <appendToFile value="true"/>
- <rollingStyle value="Date"/>
- <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
- <staticLogFileName value="false"/>
- <param name="MaxSizeRollBackups" value=""/>
- <layout type="log4net.Layout.PatternLayout">
- <!--每条日志末尾的文字说明-->
- <!--输出格式-->
- <!--样例:-- ::, [] INFO Log4NetDemo.MainClass [(null)] - info-->
- <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>
- </layout>
- </appender>
- <!--Info日志-->
- <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
- <param name="File" value="Log\\LogInfo\\" />
- <param name="AppendToFile" value="true" />
- <param name="MaxFileSize" value="" />
- <param name="MaxSizeRollBackups" value="" />
- <param name="StaticLogFileName" value="false" />
- <param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
- <param name="RollingStyle" value="Date" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n"/>
- </layout>
- </appender>
- <!--监控日志-->
- <appender name="MonitorAppender" type="log4net.Appender.RollingFileAppender">
- <param name="File" value="Log\\LogMonitor\\" />
- <param name="AppendToFile" value="true" />
- <param name="MaxFileSize" value="" />
- <param name="MaxSizeRollBackups" value="" />
- <param name="StaticLogFileName" value="false" />
- <param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
- <param name="RollingStyle" value="Date" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n跟踪描述:%message%newline %n"/>
- </layout>
- </appender>
- <!--Error日志-->
- <logger name="logerror">
- <level value="ERROR" />
- <appender-ref ref="RollingLogFileAppender" />
- </logger>
- <!--Info日志-->
- <logger name="loginfo">
- <level value="INFO" />
- <appender-ref ref="InfoAppender" />
- </logger>
- <!--监控日志-->
- <logger name="logmonitor">
- <level value="Monitor" />
- <appender-ref ref="MonitorAppender" />
- </logger>
- </log4net>
- </configuration>
log4net.config
然后引用监控,在Global.asax 里加上这段
- GlobalConfiguration.Configuration.Filters.Add(new WebApiTrackerAttribute());
- 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记录监控日志的更多相关文章
- C# 使用Log4Net记录程序日志
在之前的博客中,写过使用系统内置的Trace类记录程序日志,具体请参考:C# 使用Trace记录程序日志.这篇博客将介绍如何使用Log4Net记录程序日志. 首先需要引用Log4Net.dll,我们可 ...
- C#中四步轻松使用log4net记录本地日志
在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...
- C#中四步轻松使用log4net记录本地日志(WPF有点小区别)
在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...
- ASP.NET MVC中Log4Net记录错误日志的使用
第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...
- WebForm应用log4net记录错误日志——使用线程列队写入
我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...
- 在ASP.NET MVC中使用Log4Net记录异常日志,出错时导向到静态页
本篇体验在ASP.NET MVC 4中使用Log4Net记录日志. 通过NuGet安装Log4Net. 需求是:当出错时导向到Error.html静态页面,Log4Net记录错误信息. 大致的思路是: ...
- log4net记录系统错误日志到文本文件用法详解(最新)
此配置文件可以直接拿来用,配置文件上面有详细用法说明,里面也有详细注释说明.此配置文件涵盖按照日期记录和按照文件大小(建议)的实例. 又包括:按照Fatal.Info.Error.Debug.Warn ...
- log4net记录系统错误日志到文本文件用法详解
log4net是一个完全免费开源的插件,可以去官网下载源码. 一般系统操作日志不会用log4net,自己写代码存入数据库更方便合理,但是系统部署后运行在客户环境,难免会发生系统bug.崩溃.断网等无法 ...
- OpenLayers 6 学习笔记2 WMS服务避坑记录
心血来潮,花1小时安装软件写代码+复习api,顺便熟悉一波wms 再次强化认知了wms获取要素的能力没有wfs强,有待考究 原文链接(转载请声明@秋意正寒 博客园/知乎/B站/csdn/小专栏):h ...
随机推荐
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- 游戏服务器菜鸟之C#初探一游戏服务
本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...
- npm package.json属性详解
概述 本文档是自己看官方文档的理解+翻译,内容是package.json配置里边的属性含义.package.json必须是一个严格的json文件,而不仅仅是js里边的一个对象.其中很多属性可以通过np ...
- gitHub使用入门和github for windows的安装教程
在看这篇教程之前我想大家也在搜索怎样使用gitHub托管自己的项目,在使用gitHub之前我也遇到过各种问题,在网上我也搜索了很多,但总觉得网上搜索到的东西很多很杂,有的根本不知道是在表达什么.在这过 ...
- 简记用ArcGIS处理某项目需求中数据的步骤
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目需求涉及如下几个步骤: a.矢量化 b.获取范围内要素 ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- 如何优化coding
如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码.如果代码写的好的,不用debug就可以一眼看出来哪里出了问题.实际上,我都要deb ...
- 推荐一个ASP.NET网站内容管理系统源码
许多人都有各自的兴趣,如打球.踢毽子.看书.看电视.玩游戏等等....我近来迷上了猜灯谜,于是业余做了一个在线猜灯谜的网站:何问起谜语. 先出个谜语让你猜猜:不可缺一点(打一字).可以在线猜:http ...
- C# Entity Framework并发处理
原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...
- SuperMap-iServer-单点登录功能验证(CAS)
SuperMap-iServer-单点登录功能验证(CAS) 1.测试目的: 验证SuperMap-iServer使用CAS单点登录的功能是否正常. 2.测试环境: SuperMap-iServer8 ...