1. 程式人生 > 實用技巧 >筆試考試系統--專案搭建及用Log4Net記錄日誌

筆試考試系統--專案搭建及用Log4Net記錄日誌

專案架構搭建
一、專案整體採用分層結構,不搞傳統的三層架構,直接用Ul+Service (只是根據專案的不同的變體而已,思想上沒什麼不-樣),建ExamOnLine.Common、ExamOnLine.IService、ExamOnLine. Service、ExamOnLine.DTO、 ExamOnLine.Front.Web、ExamOnLine.Admin.Web、 ExamOnLine.UnitTest(單元測試可以後期再搭)

效果如下:

搭建完成後一定不要忘了各個專案之間的引用

UI層也要安裝EF 層之間新增引用:

ExamOnLine.Iservice層新增:對DTO層的引用、

ExamOnLine.Service層新增:對ExamOnLine.Iservice、ExamOnLine.ZSZ.DTO的引用

ExamOnLine.ExamOnLine.AdminWeb層新增:ExamOnLine.Iservice、ExamOnLine.Service、ExamOnLine.Common、ExamOnLine..DTO引用

ExamOnLine.Front.Web與ExamOnLine..Admin.Web一樣

新增引用步驟如下:

二、配置Log4Net;(前後臺都配置)

搭建ExceptionFilter 列印到Log4Net未處理異常;把EF的日誌通過Debug方式列印到Log4Net;具開發EF實體部分:然後編寫單元測試,確保執行沒問題;後面用的時候都下Database .Setlnitializer<XXXDbContext>(null)

(一)先給大家介紹下Log4Net簡介:

1:什麼是日誌,為什麼需要記錄日誌?

2:Log4NET 是一個從 Java 版的 Log4J 移植過來的日誌框架,可以簡化日誌的記錄;

3、 Log4NET 的概念:

a) 級別:trace、debug、info、warn、error、fatal。常用 debug(除錯資訊,程式設計師臨 時跟蹤執行,在正式執行的專案中應該不顯示);warn(警告);error(錯誤)。

b) 特殊的級別:all(全部顯示);off(全部不顯示);

c) appender:可以把日誌輸出到控制檯、檔案、資料庫、ftp 伺服器,甚至可以把日 志輸出到郵件、簡訊等。不同的輸出場景就是不同的 appender,可以新增多個 appender,可以設定不同的級別級別使用不同的 appender

(二)Log4Net使用步驟:

1:新增Install-Package Log4NET

2:如果 NuGet 沒有給自動配置 App.config,那麼就要在<configuration>的<configSections>節點下 新 增 ( 要 在 頭 部 ) : <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

3:在webConfig裡面新增子節點(在configuration下新增),具體程式碼如下:

<log4net>
    <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
    <!-- Set root logger level to ERROR and its appenders -->
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileTracer" />
    </root>
    <!-- Print only messages of level DEBUG or above in the packages -->
    <appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="App_Data/Log/" />
      <param name="AppendToFile" value="true" />
      <param name="RollingStyle" value="Composite" />
      <param name="MaxSizeRollBackups" value="10" />
      <param name="MaximumFileSize" value="1MB" />
      <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" />
      </layout>
    </appender>
  </log4net>

4:在程式啟動的時候:log4net.Config.XmlConfigurator.Configure();。容易忘,如果發現日誌檔案一直沒有,先想是不是忘了寫這句話。

5:記 錄 信 息 : ILog logger = LogManager.GetLogger(typeof(WebForm1));

logger.Debug("aaaaaaaaaaaaaa");

6:效能優化: logger.DebugFormat(“hello {0} {}”,"hello")等。 用{n}佔位符,而不是字串拼接,這樣如果配置中不輸出這個級別的時候,就不會進行字串拼接,提升效能。

(三)搭建 ExceptionFilter 列印到 Log4Net 記錄Action未處理的異常;把 EF 的日誌通過Debug 方式列印到 Log4Net,原理如下:

具體配置步驟:

1:新建一個類,在App_Start裡面

using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ExamOnLine.Admin.Web.App_Start
{
    public class ExamOnLineExceptionFilter : IExceptionFilter
    {
        private static ILog log = LogManager.GetLogger(typeof(ExamOnLineExceptionFilter));//宣告Log4NET物件,建議一個類就宣告一個ILog物件

        public void OnException(ExceptionContext filterContext)
        {
            //只要action出現未處理的異常,這個方法裡面都可以捕獲到
            log.ErrorFormat("出現未處理的異常{0}", filterContext.Exception);
        }
    }
}

2:在global裡面新增 GlobalFilters.Filters.Add(new ZSZExceptionFilter()); //增加自定義異常處理器

using ExamOnLine.Admin.Web.App_Start;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace ExamOnLine.Admin.Web
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            //如果發現日誌檔案一直沒有,先想是不是忘了寫這句話。
            log4net.Config.XmlConfigurator.Configure();
             GlobalFilters.Filters.Add(new ExamOnLineExceptionFilter()); //增加自定義異常處理器

            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}

這樣就可以了

今天的博文就到這裡,明天給大家分享如何配置EF,配置EF;編寫實體公共父類