在项目中引用log4net.dll

1、在Models文件夹内,定义一个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(){//ControllerName:{0}Controller//ActionName:{1} //开始时间:{2}//结束时间:{3}//总 时 间:{4}秒//Action参数:{5}//Http请求头:{6}//客户端IP:{7} //HttpMethod:{8}string Msg = "Action执行监控:\r\nControllerName:{0}Controller\r\nActionName:{1}\r\n开始时间:{2}\r\n结束时间:{3}\r\n总 时 间:{4}秒\r\nAction参数:{5}\r\nHttp请求头:{6}\r\n客户端IP:{7}\r\nHttpMethod:{8}";return string.Format(Msg,ControllerName,ActionName,ExecuteStartTime,ExecuteEndTime,(ExecuteEndTime - ExecuteStartTime).TotalSeconds,GetCollections(ActionParams),HttpRequestHeaders,GetIP(),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 == 0){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(0, Parameters.Length - 1);}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;}}

2、在Helper文件夹内,定义一个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);}}

3、在App_Start文件夹内,定义一个WebApiTrackerAttribute特性类,继承于ActionFilterAttribute,并在App_Start的WebApiConfig.cs进行注册

 /// <summary>/// WebAPI监控/// </summary>public class WebApiTrackerAttribute : ActionFilterAttribute{private readonly string Key = "_thisWebApiOnActionMonitorLog_";/// <summary>/// 调用前验证/// </summary>/// <param name="actionContext">操作上下文</param>public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext){base.OnActionExecuting(actionContext);ZrTestItemsWebApi.Models.WebApiMonitorLog MonLog = new ZrTestItemsWebApi.Models.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 = 0;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}/// <summary>/// 验证之后/// </summary>/// <param name="actionExecutedContext">操作上下文</param>public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext){ZrTestItemsWebApi.Models.WebApiMonitorLog MonLog = actionExecutedContext.Request.Properties[Key] as ZrTestItemsWebApi.Models.WebApiMonitorLog;MonLog.ExecuteEndTime = DateTime.Now;MonLog.ActionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;MonLog.ControllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;log4net.LogManager.GetLogger("logmonitor").Info(MonLog.GetLoginfo());if (actionExecutedContext.Exception != null){string Msg = string.Format("请求【{0}Controller】的【{1}】产生异常:\r\n异常信息:{2}\r\nAction参数:{3}\r\nHttp请求头:{4}\r\n客户端IP:{5}\r\nHttpMethod:{6}", MonLog.ControllerName, MonLog.ActionName, actionExecutedContext.Exception.ToString(), MonLog.GetCollections(MonLog.ActionParams), MonLog.HttpRequestHeaders, MonLog.GetIP(), MonLog.HttpMethod);log4net.LogManager.GetLogger("logerror").Error(Msg);}base.OnActionExecuted(actionExecutedContext);}}

4、在Configs文件夹内,新建一个log4net.config

<?xml version="1.0" encoding="utf-8"?>
<configuration><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><log4net><!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --><!--错误日志--><appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"><!--日志路径--><!--<param name="File" value="D:\ElevatorSystem\SafeElevator\SafeElevator\App_Log\servicelog\" />--><param name="File" value="log\\LogError\\" /><!--是否是向文件中追加日志--><param name="AppendToFile" value="true" /><!--文件最大容量--><param name="MaxFileSize" value="10240" /><!--log保留天数--><param name="MaxSizeRollBackups" value="100" /><!--日志文件名是否是固定不变的--><param name="StaticLogFileName" value="false" /><!--日志文件名格式为:2008-08-31.log--><param name="DatePattern" value="yyyy\\yyyyMM\\yyyy-MM-dd&quot;.txt&quot;" /><!--日志根据日期滚动--><param name="RollingStyle" value="Date" /><layout type="log4net.Layout.PatternLayout"><!--<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />--><!--<conversionPattern value="%d [%t] %-5p %c - %m%n %loggername" />--><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="10240" /><!--log保留天数--><param name="MaxSizeRollBackups" value="100" /><!--日志文件名是否是固定不变的--><param name="StaticLogFileName" value="false" />      <param name="DatePattern" value="yyyy\\yyyyMM\\yyyy-MM-dd&quot;.txt&quot;" /><!--日志根据日期滚动--><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="10240" /><!--log保留天数--><param name="MaxSizeRollBackups" value="100" /><!--日志文件名是否是固定不变的--><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="yyyy\\yyyyMM\\yyyy-MM-dd&quot;.txt&quot;" /><!--日志根据日期滚动--><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><!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --><!--root是一个父级的logger,所有Logger列表的形式写在里面,相当于多个looger分开定义--><!-- <root><level value="ALL" />      <appender-ref ref="RollingLogFileAppender" /></root>--></log4net></configuration> 

5、启用log4net配置,在Global.asax中注册log4net

void Application_Start(object sender, EventArgs e){// 在应用程序启动时运行的代码
            ZrTestItemsWebApi.App_Start.WebApiConfig.Register(System.Web.Http.GlobalConfiguration.Configuration);log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Configs\\log4net.config"));//启用log4net配置}

参考网址:https://www.cnblogs.com/huangenai/archive/2016/04/23/5424596.html

转载于:https://www.cnblogs.com/douf/p/11056546.html

WebApi服务监控 log4net记录监控日志相关推荐

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

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

  2. C#如何使用log4net记录本地日志

    方法一(新解决方案用方案一): 第一步:将Log4Net dll文件拷贝到项目生成文件目录下,并在解决方案中引用该dll,如下图: 第二步:添加配置文件,命名为log4net.config,如下图: ...

  3. asp.net mvc中加入log4net记录错误日志

    直接上代码示例:https://share.weiyun.com/aff36f2547514cfefe129ebb8ccb28ef 首先添加加log4net的dll,推荐用nuget.... 贴上配置 ...

  4. 演示如何利用log4net记录程序日志信息

    log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括 MS SQL Server, Access, Oracl ...

  5. .net中调用esb_大型ESB服务总线平台服务运行分析和监控预警实践

    今天准备谈下ESB总线平台建设项目中的服务运行统计分析,服务心跳监测,服务监控预警方面的设计和实现.可以看到,在一个ESB服务总线平台上线后,SOA治理管控就变得相当重要,而这些运行监控分析本身也是提 ...

  6. 微服务来了,监控怎么办?

    设想今天是个愉快的周末,天气很好,你带着孩子在公园闲逛,这时候,一条短信来了: 瞬间整个人都不好了,到底怎么回事,上面的业务有没有预警,赶紧把相关人召集一下,最好赶紧去下公司吧!也许这时候你会想:能不 ...

  7. 分布式技术与实战第七课 高并发下高可用的熔断、降级、限流和负载均衡、监控以及统一的日志系统

    第39讲:从双十一看高可用的保障方式 从这一课时开始,专栏内容进入最后一个模块,即分布式高可用系列,这部分的内容,我将以电商大促为背景,讲解系统限流.降级熔断.负载均衡.稳定性指标.系统监控和日志系统 ...

  8. 监控宝 mysql_监控宝服务性能监控配置(完整版)

    继上篇监控宝服务器监控后,此篇博文详细记录下项目中对常用服务监控的配置步骤 监控宝服务性能监控配置(完整版) 一.目的 本文是在<监控宝服务器与服务性能监控配置>(URL:https:// ...

  9. 基于网络抓包实现kubernetes中微服务的应用级监控

    微服务是什么? 此话题不是本文重点,如你还不知道.请谷歌一波,会有遍地的解释.引用下图说明下微服务可能呈现的形态: 微服务监控的挑战 监控的目的是为了让集群中所有的服务组件,不管是HTTP服务,数据库 ...

最新文章

  1. python中 str 和 repr_python repr()与str()区别总结
  2. 换个角度看敏捷1-敏捷问题解决方式
  3. gpio mysql_GPIO控制LED
  4. windows7系统损坏修复_windows系统启动不了,怎么办?一招轻松搞定!
  5. MATLAB中数组的原始索引和线性索引之间相互进行转换
  6. atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php
  7. Android Eclipse 导入 AS Gradle AAR 库手册
  8. 制定自动化测试实施计划
  9. 在BREW中打造自己的GUI(8)-IWEB的封装
  10. PowerBuilder方式下图像存储功能的研究
  11. 自然人机交互到底“自然”在哪儿?
  12. 连续潜在变量---主成分分析
  13. linux gif 编辑软件,Ubuntu 16.10 安装byzanz截取动态效果图工具
  14. 财务系统数字转化方法
  15. 9.png图片的处理
  16. LCT求解最小生成树
  17. 【JavaScript】原生态兼容IE6的图片轮播
  18. 【企业架构设计实战】应用架构设计
  19. 程序的指令和数据为什么分开存放?
  20. EL表达式三目运算符

热门文章

  1. 074_JSON.stringify()
  2. mysql5.0修改字符集,查看mysql字符集及修改表结构
  3. 宁波大红鹰学院计算机毕设,网络文化对价值观的影响调查报告马克思主义基本原理概论》课程调查实践报告大学毕业设计.doc...
  4. pcb外观维修_电路板常用维修技巧,送给从事维修工作的兄弟姐妹们
  5. 引入antd组件样式_扩大团队技术影响力,搭建团队自己的 UI 组件库
  6. jQuery Mobile 快速入门
  7. macbook下载苹果版Photoshop cc2019 for mac
  8. python按行求和_Python第一篇:对3个Excel文件进行整合
  9. nodeJs实现文件上传,下载,删除
  10. poj3279 Fliptile