.net mvc配置log4net記錄日誌
阿新 • • 發佈:2021-06-18
先新增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=""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="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資料夾下找日誌檔案