在MVC使用Log4Net

来源:互联网 发布:网络学习论坛发帖 编辑:程序博客网 时间:2024/06/06 08:19

1.我们的网站发布之后还是有可能出现很多的错误,这个时候我们不可能加断点进行调试,这能根据日志里面的错误信息进行调试

2.我们首先想到,用户访问网站出错后,我们将错误信息记录到日志里面去,但是多用户并发访问,多线程同时写入日志会出错,我们自然想到写入日志时,加上一把锁lock

3.加上锁后,会遇到用户等待相应的情况,因此我们就想,将错误消息,先放到一个消息队列中去,这样就能够及时响应用户了,然后我们开辟一个线程,不停的从错误消息队列中取得消息,写入到日志中去

4.我们的日志记录到什么地方也是不一定的,可能放到数据库,或者保存到一个txt文件中,这时候就用到我们的观察者模式了,log4net就是这样做的(一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具)

下面是具体操作


第一步:配置文件

   <configSections><!--Log4net的块配置-->    <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="ERROR"/>      <appender-ref ref="SysAppender"/>    </root>    <!-- Print only messages of level DEBUG or above in the packages -->    <logger name="WebLogger">      <level value="DEBUG"/>    </logger>    <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >      <param name="File" value="App_Data/" />      <param name="AppendToFile" value="true" />      <param name="RollingStyle" value="Date" />      <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />      <param name="StaticLogFileName" value="false" />      <layout type="log4net.Layout.PatternLayout,log4net">        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />        <param name="日志开始" value="----------------------header--------------------------" />        <param name="日志结束" value="----------------------footer--------------------------" />      </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程序集
    //从配置文件读取log4net的配置,然后进行一个初始化工作。    log4net.Config.XmlConfigurator.Configure();

第三步:我们使用观察者模式,可以任意切换写日志到不同的地方(.txt,关系型数据库,MongoDB等)

3.1 先申明一个写入接口

namespace Company.OA.Common{    public interface ILogWriter    {        void WriteLogInfo(string txt);    }}

3.2  写入到.txt

    public class Log4NetWriter : ILogWriter    {        public void WriteLogInfo(string txt)        {            ILog logWriete = log4net.LogManager.GetLogger("Demo");            logWriete.Error(txt);        }    }

3.3 观察者模式进行写入(这个观察者是用集合写的)

    public class LogHelper    {        public static Queue<string> ExceptionStringQueue = new Queue<string>();        public static List<ILogWriter> LogWriterList = new List<ILogWriter>();        static LogHelper()        {            LogWriterList.Add(new Log4NetWriter());            //把从队列中获取错误消息写到 日志文件里面去。            ThreadPool.QueueUserWorkItem(o =>            {                while (true)                {                    lock (ExceptionStringQueue)                    {                        if (ExceptionStringQueue.Count > 0)                        {                            string str = ExceptionStringQueue.Dequeue();                            //把异常信息 写到  日志文件里面去。                            //变化点:有可能写到日志文件,有可能写到数据库里面去。有可能两个地方都写。                            foreach (var logWriter in LogWriterList)                            {                                logWriter.WriteLogInfo(str);                            }                        }                        else                        {                            Thread.Sleep(30);                        }                    }                }            });        }    //把错误消息写到写到队列中      public static void WriteLog(string exceptionText)        {            lock (ExceptionStringQueue)            {                ExceptionStringQueue.Enqueue(exceptionText);            }        }    }
4.在Models里面创建一个类,不断将错误消息加入到日志中

    public class MyExceptionFilterAttribut : HandleErrorAttribute    {        public override void OnException(ExceptionContext filterContext)        {            base.OnException(filterContext);            //自己处理异常            //直接把错误信息写到日志文件里面去。            Common.LogHelper.WriteLog(filterContext.Exception.ToString());        }    }

因此我们要在App_Start中将添加过滤

filters.Add(new MyExceptionFilterAttribut());

这样我们就成功了!



0 0
原创粉丝点击