ASP.NET MVC中解決日志並發處理log4net


本章主要內容是將異常信息寫到隊列中,然后通過線程寫到文本文件中,速度非常快,沒有阻塞和延遲加載

1.首先在Model中建一個類MyExceptionAttribute.cs

public class MyExceptionAttribute : HandleErrorAttribute //繼承
{
    public static Queue<Exception> exceptionQuese = new Queue<Exception>(); 
  //重寫父類方法,一拋異常就會執行這個方法
public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); exceptionQuese.Enqueue(filterContext.Exception);//將異常依靠添加到隊列中 filterContext.HttpContext.Response.Redirect("/Error.html");//出現異常后轉到錯誤頁 } }

2.打開Global.asax文件,找到RegisterGlobalFilters並轉到定義,讓里面的方法new自己定義的類

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //filters.Add(new HandleErrorAttribute());
        filters.Add(new MyExceptionAttribute());
    }
}

3.在Global.asax文件下添加如下內容,當應用程序一打開時就執行一個線程,使用線程池,好處是為了避免線程頻繁的創建,節省CPU耗用內存

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        log4net.Config.XmlConfigurator.Configure();//讀取Log4Net配置信息
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //string fileLogPath = Server.MapPath("/App_Data/");
        //WaitCallback
        ThreadPool.QueueUserWorkItem((a) =>
        {
            while (true)
            {
                if (MyExceptionAttribute.ExceptionQueue.Count > 0)
                {
                    Exception ex = MyExceptionAttribute.ExceptionQueue.Dequeue();//出隊
                    //string fileName = DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
                    //File.AppendAllText(fileLogPath + fileName, ex.ToString(), Encoding.Default);
                    ILog logger = LogManager.GetLogger("errorMsg");
                    logger.Error(ex.ToString());
                }
                else
                {
                    Thread.Sleep(3000);//如果隊列中沒有數據,休息避免造成CPU的空轉.
                }
            }
        });
    }
}

4.打開Web.config,在configuration---configSections節點內添加

<configuration>
  <configSections>
    <!--Log4Net配置-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

緊跟着在上面的</configSections>后面添加如下內容

    <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">
      <level value="ERROR"/>
    </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="&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>
</configuration>

5.建一個控制器Test測試一下

public ActionResult Test()
{
    int a = 2;
    int b = 0;
    int c = a / b;
    return Content(c.ToString());
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM