ASP.NET MVC 使用Log4Net记录系统运行中问题

log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。

在NuGet程序包中下载log4Net组件,如下图所示: 

 

打开Web.config文件,在<configSections>中添加如下配置节点:

  <configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections>

 紧靠上图节点,添加如下配置节点:

  <!--log4Net的另一种配置:动态配置--><log4net><!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --><!-- Set root logger level to ERROR and its appenders --><root><level value="ALL"/><appender-ref ref="SysAppender"/></root><!-- Print only messages of level DEBUG or above in the packages --><logger name="WebLogger"><!--这里进一步限制了日志级别,只有在大于等于DEBUG的情况下才会记录日志--><level value="DEBUG"/></logger><appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" ><!--日志放在项目的App_Data文件夹--><param name="File" value="App_Data/" /><!--日志以追加形式记录--><param name="AppendToFile" value="true" /><!--日期作为回滚:日期排序--><param name="RollingStyle" value="Date" /><!--设置日志文件名称的生成规则 --><param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" /><!--日志文件是否静态:否--><param name="StaticLogFileName" value="false" /><!--日志格式的内容和布局--><layout type="log4net.Layout.PatternLayout,log4net"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /><param name="Header" value="&#13;&#10;----------------------header--------------------------&#13;&#10;" /><param name="Footer" value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" /></layout></appender><appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"><layout type="log4net.Layout.PatternLayout,log4net"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /></layout></appender></log4net><!--Log4Net配置结束-->

注意: <configSections> 必须是 <configuration>元素下第一个子元素,并且是唯一的。不然会报错,报错界面如下所示:

 

 

在Global.asax.cs文件中的Application_Start方法中,插入如下代码: 

log4net.Config.XmlConfigurator.Configure();

考虑到记录日志会存在并发的问题,这里通过队列的方式来记录日志:把所有产生的日志信息存放到一个队列里,然后通过新建一个线程不断的从这个队列里读取异常信息,然后往日志里写,这也就是所谓的生产者--消费者模式。 

新建一个类MyErrorAttribute ,继承自全局异常类HandleErrorAttribute,,如下图所示:

    public class MyErrorAttribute:HandleErrorAttribute{public static Queue<Exception> ExceptionQueue = new Queue<Exception>();public override void OnException(ExceptionContext filterContext){ExceptionQueue.Enqueue(filterContext.Exception);base.OnException(filterContext);}}

 在FilterConfig类中替换成 上图 自定义的 类:

        public static void RegisterGlobalFilters(GlobalFilterCollection filters){//filters.Add(new HandleErrorAttribute());//注释掉系统默认的filters.Add(new MyErrorAttribute());}

在Global.asax.cs文件中的Application_Start方法中,再插入如下代码:

            ThreadPool.QueueUserWorkItem(o =>{while (true){if (MyErrorAttribute.ExceptionQueue.Count > 0){Exception ex = MyErrorAttribute.ExceptionQueue.Dequeue();if (ex != null){log4net.ILog logger = log4net.LogManager.GetLogger("testError");logger.Error(ex.ToString());//将异常写入log4net}else{Thread.Sleep(50);}}else{Thread.Sleep(50);}}});

此时, Global.asax.cs文件中的Application_Start方法已经变成如下图所示的样子了:

        protected void Application_Start(){log4net.Config.XmlConfigurator.Configure();AreaRegistration.RegisterAllAreas();FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);ThreadPool.QueueUserWorkItem(o =>{while (true){if (MyErrorAttribute.ExceptionQueue.Count > 0){Exception ex = MyErrorAttribute.ExceptionQueue.Dequeue();if (ex != null){log4net.ILog logger = log4net.LogManager.GetLogger("testError");logger.Error(ex.ToString());//将异常写入log4net}else{Thread.Sleep(50);}}else{Thread.Sleep(50);}}});}

 

接下去开始测试:在控制器中添加一段引发异常的代码,如下图所示: 

        public ActionResult About(){int result = 0;int x = 1, y = 0;result = x / y;  //引发异常ViewBag.Message = "Your application description page.";return View();}

运行,系统跳转到error界面,如下图所示:

 

打开App_Data文件,查看日志文件如下所示: 

 

至此为止,一个利用Log4Net记录系统异常的功能开发完成了。 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lzo的安装及在hadoop中的配置

一、前提1、gcc的安装&#xff1a;yum install lib* glibc* gcc* 如果lzo编译出错时可能需要安装2、ant的安装&#xff1a;安装略&#xff0c;最好1.8.2及以上版本&#xff0c;并设置好环境变量 在第三步需要用到ant二、lzo的安装wget http://www.oberhumer.com/opensource/lzo…

ASP.NET MVC 使用Log4Net在不同目录中记录不同类型的日志

在上一篇文章中&#xff0c;实现了利用Log4Net记录系统中出现的问题。如果同时还需要记录用户操作的监控日志&#xff0c;就需要一些修改 修改Web.Cofig配置文件 ,增加一个logger节点和appender节点&#xff0c;用于监控操作日志配置&#xff0c;并且设置不同的日志文件路径&am…

简明python教程 --C++程序员的视角(七):异常

当你的程序中出现某些 异常的 状况的时候&#xff0c;异常就发生了。例如&#xff0c;当你想要读某个文件的时候&#xff0c;而那个文件不存在。或者在程序运行的时候&#xff0c;你不小心把它删除了。上述这些情况可以使用异常来处理。 假如你的程序中有一些无效的语句&#x…

C#中@符号的作用

一、忽略转义字符 string fileName "D:\\文本文件\\text.txt"; string fileName "D:\文本文件\text.txt"; 二、让字符串跨行 string strSQL "SELECT * FROM HumanResources.Employee AS e" " INNER JOIN Person.Contact AS c" &qu…

医疗信息化、医学、医院管理、医疗器械资料下载

1. 电子病历无纸化存储条件已经成熟&#xff08;251医院王景明&#xff09; http://share.hc3i.cn/data/115 2. 基于JCI标准管理医院药品库房的探讨 http://share.hc3i.cn/data/34902 3. 民营医院管理模式与特点的探讨 http://share.hc3i.cn/data/29181 4. 数据仓库技术架构及方…

【流媒體】Android 实时视频采集—Camera预览采集

【流媒體】Android 实时视频采集—Cameara预览采集 SkySeraph Mar 26th 2012 SZ Email&#xff1a;skyseraph00163.com 更多精彩请直接访问SkySeraph个人站点&#xff1a;www.skyseraph.com 流媒体系列&#xff1a; http://skyseraph.com/2012/04/11/Media/流媒体专题/ 1 概…

C#中使用SqlBulk百万级数据秒级插入

本文转自这篇文章&#xff0c;提供了一种较快的数据插入的思路&#xff0c;转过来做个记录。 #region static void Insert() {Console.WriteLine("使用Bulk插入的实现方式");Stopwatch sw new Stopwatch();DataTable dt GetTableSchema(); using (SqlConnection …

利用JQuery插件CleverTabs实现多页签打开效果

在VS中&#xff0c;我们能打开多页签&#xff0c;并在不同的页签之间进行浏览和操作&#xff0c;这一功能通过JQuery插件CleverTabs也能实现此效果。CleverTabs下载请点击这里&#xff1a;JQuery CleverTabs 本文采用ASP.NET MVC技术实现效果&#xff1a;要在布局页中点击不同的…

指针的一个简单应用

#include "stdafx.h" int main(int argc, char* argv[]){ //string s("hello world"); string s "hello world"; string *p &s; *p "goodbye";//此时字符串s的值也变化了 string *sp &s; sp p; *sp "new another w…

精通ASP.NET MVC ——路由

本文章将关注定义路由&#xff0c;并使用它们去处理URL&#xff0c;使用户能够到达控制器和动作。 文章非常长&#xff0c;可以对路由机制有较初步的了解。首先创建示例项目&#xff0c;项目名为UrlAndRoutes&#xff0c;如下图所示&#xff1a; 然后是创建示例控制器和示例视图…

建立丰富多彩的toast的简单实例

为toast中的view显示建立一个layout的xml文件&#xff0c;放到res的layout目录下 下面是对xml的调用 //先通过LayoutInflater来将xml文件中的 Layout变成一个view。这个类可以将XML实例化&#xff0c;形成一个View。以文本为例&#xff0c;要从一个XML文档生成一个可供使用的Vi…

ASP.NET Web API简单学习

Web API 简介 Web API可以返回 json、xml类型的数据&#xff0c;对于数据的增删改查&#xff0c;提供了对应的资源操作&#xff0c;按照要求的类型进行处理&#xff0c;主要包括&#xff1a;Get&#xff08;查&#xff09;&#xff0c;Post&#xff08;增&#xff09;&#xff…

我的家庭私有云计划-2

嗯&#xff0c;继续。 刚才调试了一个崩溃型bug&#xff0c;都不是大问题&#xff0c;但几个小问题加到一起&#xff0c;居然弄崩溃了。这种远因叠加的bug最难找&#xff0c;还好找到了。 拿到预算了&#xff0c;下面做什么&#xff1f; 我是商用程序员&#xff0c;习惯性要做需…

利用NCO 3.0 调用SAP中的函数

简介 .Net Connector 3.0&#xff0c;简称 Nco3.0。Nco3.0 是 SAP 针对 .net 平台提供的编程接口&#xff0c;由 Nco1.0/Nco2.0 演变而来。如果使用 .net 平台编程&#xff0c;推荐使用 NCo3.0。3.0 版与之前1.0/2.0 版本比较&#xff0c;不管是 API 还是架构&#xff0c;都重新…

char与varchar区别(MYISAM)

Char属于固定长度的字符类型&#xff0c;而varchar属于可变长的字符类型。 下表将各种字符串值保存到char(4)和varchar&#xff08;4&#xff09;列后的结果&#xff0c;说明了char和varchar之间的差别 值 Char(4) 存储需求 Varchar (4) 存储需求 ‘’ ‘ ’ 4字符节…

以团队之名

我们是一群来自草根的互联网团队&#xff0c;以团队之名~ 转载于:https://www.cnblogs.com/weblab/archive/2012/04/01/2429427.html

Win10系统局域网中的其他电脑能Ping通但是无法访问本地IIS发布的网站

局域网中的其他电脑无法访问本地IIS发布的网站&#xff0c;但是能ping通&#xff0c;基本是由于没开放端口的原因。 打开防火墙 —— 高级设置&#xff1a; 点击“入站规则”&#xff0c;然后是“新建规则”&#xff1a; 然后选择“端口” &#xff1a; 选择“TCP”&#xff0c…

Bash shell脚本练习(一)

一、此题来源51cto linux论坛版 用户输入A;B;C;D;E;F;G 输入A的话就查看/etc/passwd最后5个系统用户&#xff0c;只要显示用户名和UID就行了&#xff0c;其他不要 输入B的话就显示系统开机时间多久了 输入C的话就判断当前磁盘根目录使用情况是否超过50%&#xff0c;如果超过50%…

ASP.NET Web API 中的属性路由

为什么要有属性路由 基于约定路由的一个优点是模板在单个位置中定义&#xff0c;并且路由规则在所有控制器上一致的应用。但是基于约定的路由很难支持RESTFUl 中常见的某些URI模式。例如&#xff0c;资源通常包含子资源&#xff0c;客户有订单&#xff0c;电影有演员&#xff…

C#调试WebService

简单调试 1、首先&#xff0c;新建一个WebService项目用于测试&#xff0c;如下图所示&#xff1a; 2、项目会默认生成一个Hello方法&#xff0c;但是由于Hello方法太简单&#xff0c;添加一个Add方法用于计算两个整数之和&#xff0c;如下图所示&#xff1a; [WebMethod]publ…