WebApi服务监控 log4net记录监控日志
生活随笔
收集整理的这篇文章主要介绍了
WebApi服务监控 log4net记录监控日志
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
在项目中引用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".txt"" /><!--日志根据日期滚动--><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".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="10240" /><!--log保留天数--><param name="MaxSizeRollBackups" value="100" /><!--日志文件名是否是固定不变的--><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="yyyy\\yyyyMM\\yyyy-MM-dd".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><!--(高) 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记录监控日志的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: MySQL 备份和恢复策略(二)
- 下一篇: jenkins部署java项目(五)