1. 程式人生 > 其它 >.net mvc配置log4net記錄日誌

.net mvc配置log4net記錄日誌

先新增log4net.dll引用 通過NuGet來引入

先配置log4net 需要的配置檔案,新建一個CfgFiles資料夾,新增一個web配置檔案,該名為log4net.config 順便在添加個Log資料夾用來放日誌

log4net.config內容如下

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <!--OFF>FATAL>ERROR>WARN>INFO>DEBUG,ALL-->
    <root>
      <level value="
ALL"/> <!--檔案形式記錄日誌--> <appender-ref ref="SysAppender"/> </root> <logger name="WebLogger"> <!--檔案形式記錄日誌--> <level value="DEBUUG"/> </logger> <!--指定日誌記錄方式,以滾動檔案的方式--> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net
"> <!--指定日誌存放路徑--> <param name="File" value="Log/" /> <!--日誌以追加的形式記錄--> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <!--日誌名稱生成規則--> <param name="DatePatten" 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="-------------header-----------" /> <param name="Footer" 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>

完成後在AssemblyInfo.cs檔案裡新增 [assembly:log4net.Config.XmlConfigurator(ConfigFile = @"CfgFiles/Log4net.config",ConfigFileExtension ="config",Watch =true)]

PS:因為日誌存在併發問題,所以通過佇列的方式來記錄日誌

我們在新增一個MyErrorAttribute.cs 用來處理異常並記錄日誌 它繼承全域性異常類HandleErrorAttribute

 public class MyErrorAttribute:HandleErrorAttribute
    {
        private static ILog log = LogManager.GetLogger(typeof(MyErrorAttribute));
        public static Queue<Exception> exceptions = new Queue<Exception>();
        public override void OnException(ExceptionContext filterContext)
        {
            exceptions.Enqueue(filterContext.Exception);
        ///出現異常,這裡可以讓系統跳轉的友好頁面
base.OnException(filterContext); } }

完成後,在FilterConfig類中修改系統預設的

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(new MyErrorAttribute());//我們自己定義的
        }

然後在全域性檔案Global中的Start()方法新增

ThreadPool.QueueUserWorkItem(o=>
            {
                while (true)
                {
                    if (MyErrorAttribute.exceptions.Count > 0)
                    {
                        Exception ex = MyErrorAttribute.exceptions.Dequeue();
                        if (ex!=null)
                        {
                            ILog log = LogManager.GetLogger("Error");                           
                            log.Error(ex.ToString());
                        }
                        else
                        {
                            Thread.Sleep(50);
                        }
                    }
                    else
                    {
                        Thread.Sleep(50);
                    }
                }
            
            });

這樣我們的日誌基本完成,測試一下

Action中引發一個異常

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

訪問一下About 後在Log資料夾下找日誌檔案