ABP框架 - 日誌

文檔目錄html

 

本節內容:數據庫

 

服務端apache

ABP使用Castle Windsor的日誌記錄工具,它能夠和不一樣的logginh(日誌)類庫協做:Log4Net、NLog、Serilog等。Castle爲全部Logger庫提供一個公共接口,因此它獨立於logging庫,也能夠在有須要的時候很容易地替換logging。瀏覽器

Log4Net是最流行的Logging庫,ABP模板與適當配置後的Log4Net一塊兒工做,可是它只是一個單行模式的依賴(查看「配置」主題),因此你能夠替換成你喜歡的日誌庫。app

 

獲取Logger(記錄器)ide

無論你用哪一個logging庫,寫日誌的代碼是同樣的(歸功於Castle的公共ILogger接口)。工具

首先,咱們應獲取一個Logger,因爲ABP大量使用依賴注入,因此咱們能夠用屬性注入(或構造器注入)模式來注入一個Logger對象。看一下寫一行日誌的示例類:spa

using Castle.Core.Logging; //1: Import Logging namespace

public class TaskAppService : ITaskAppService
{    
    //2: Getting a logger using property injection
    public ILogger Logger { get; set; }     public TaskAppService()
    {
        //3: Do not write logs if no Logger supplied.
        Logger = NullLogger.Instance;
    }

    public void CreateTask(CreateTaskInput input)
    {
        //4: Write logs
        Logger.Info("Creating a new task with description: " + input.Description); 
        //TODO: save task to database...
    }
}

首先,咱們引用Castle的ILogger接口的命名空間。線程

其實,咱們定義一個公開的ILogger對象,名爲Logger,這個對象將寫日誌,依賴注入系統將在TaskAppService對象建立以後,設置(注入)這個屬性,這就是著名的屬性注入模式。日誌

第三,咱們把Logger設置爲NullLogger.Instance。沒這行代碼,系統也能工做,但這是屬性注入模式的最佳實踐,若是都沒有這個Logger,在使用它時會收到一個「對象引用...「的異常。這個就是保證它爲不空,因此若是沒有設置這個Logger,它就是NullLogger。這就是著名的Null對象模式。NullLogger實質上什麼都不作,不寫任何日誌,因此咱們的類無論是有無實質上的logger,都能工做。

最後,咱們用info(信息)級別來寫一文本日誌,有幾個不一樣的級別(查看「配置」主題)。

若是咱們調用CreateTask方法,檢查日誌文件,咱們能夠看到相似如下一行日誌:

INFO  2014-07-13 13:40:23,360 [8    ] SimpleTaskSystem.Tasks.TaskAppService    - Creating a new task with description: Remember to drink milk before sleeping!

 

Logger的基類

ABP爲Mvc的控制器、Web Api的控制器、應用服務類等提供了基類。它們聲明一個Logger屬性,因此你能夠直接使用這個Logger寫日誌,不須要注入,例如:

public class HomeController : SimpleTaskSystemControllerBase
{
    public ActionResult Index()
    { 
        Logger.Debug("A sample log message...");         return View();
    }
}

注意:SimpleTaskSystemControllerBase是咱們應用特定的繼承自AbpController的基類。所以,它能夠直接使用Logger。一樣,你也能夠爲你的其它類寫公共基類,而後,你就沒必要每次注入Logger了。

 

配置

ABP模板建立的應用已經爲Log4Net完成了全部的配置。

默認配置日誌格式以下所示(每一個一行)

  • Log級別:DEBUG,INFO,WARN,ERROR,或FATAL。
  • 日期和時間:寫日誌時的日期時間。
  • 線程號:寫日誌的線程的線程號。
  • Logger名稱:一般是寫日誌的類名。
  • 日誌文本:你實質上寫日誌文本。

它們在應用的log4net.config文件裏定義,以下:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Logs/Logs.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10000KB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <appender-ref ref="RollingFileAppender" />
    <level value="DEBUG" />
  </root>
  <logger name="NHibernate">
    <level value="WARN" />
  </logger>
</log4net>

Log4net是高度可配置,並強大的logging庫,你能夠用不一樣的格式寫日誌並存向不一樣的介質(文本文件,數據庫...),你能夠設置日誌的最低級別,你能夠寫不一樣的日誌到不一樣的日誌文件,當日志文件達到指定大小時,它會自動備份並建立新的日誌文件(這個配置中,回滾文件每文件配置10000KB)等等,閱讀它本身的配置文檔獲取更多信息。

最後,在Global.asax文件中,咱們聲明要用log4net.config文件來使用Log4Net:

public class MvcApplication : AbpWebApplication
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        IocManager.Instance.IocContainer.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithConfig("log4net.config"));         base.Application_Start(sender, e);
    }
}

這是惟一一行依賴於log4net的代碼,同時,Web項目僅依賴log4net類的nuget包。因此,你能夠很容易的換成另外一個庫,而沒必要改其它日誌代碼。

 

Abp.Castle.Log4Net 包

ABP使用Castle日誌記錄工具,它不直接依賴於log4net,如上面的說法。但有一個Castle的Log4Net集成的問題,它不支持最新版的log4new。咱們建立一個nuget包,名爲Abp.Castle.Log4Net,來解決這個問題。把這個包加入到咱們解決方案後,咱們所須要作的只是在應用啓動代碼裏這樣修改代碼:

public class MvcApplication : AbpWebApplication { protected override void Application_Start(object sender, EventArgs e) { IocManager.Instance.IocContainer.AddFacility<LoggingFacility>(f => f.UseAbpLog4Net().WithConfig("log4net.config")); base.Application_Start(sender, e); } }

惟的不一樣是咱們使用「UseAbpLog4Net()「方法(定義在Abp.Castle.Logging.Log4Net命名空間裏)替換」UseLog4Net()「。當咱們使用Abp.Castle.Log4Net包,就再也不須要Castle.Windsor-log4netCastle.Core-log4net包。

 

客戶端

ABP爲客戶端定義了一個簡單的Javascript logging Api,它默認在在瀏覽器的控制檯上寫日誌,示例代碼:

abp.log.warn('a sample log message...');

更多信息,查看logging API 文檔

相關文章
相關標籤/搜索