ABP理論學習之日志記錄


返回總目錄


本篇目錄

服務端###

ABP使用的是Castle Windsor的日志記錄設備。它可以和不同的日志類庫一起工作,比如Log4Net,NLog,Serilog等等。Castle為所有的日志類庫提供了一個公共的接口。因此,你完全獨立於特定的日志記錄類庫,而且,如果需要的話,你可以輕松地改變應用程序的日志類庫。

Log4Net是.Net中最流行的日志類庫之一。ABP模板中自帶了經過合適配置的Log4Net。但是,只存在一行log4net的依賴(看下面),因此,你可以將它改為你最喜歡的類庫。

獲取Logger

無論你選擇了什么日志類庫,最終要記錄的日志代碼都是相同的(這得感謝Castle公共的ILogger接口)。

一開始,我們要處理一下記錄日志的Logger對象。因為ABP強烈推薦使用依賴注入,所以我們可以使用屬性注入模式輕松地注入一個Logger對象。如下所示:

using Castle.Core.Logging; //1: 導入 Logging 命名空間

public class TaskAppService : ITaskAppService
{    
    //2: 使用屬性注入獲得 logger
    public ILogger Logger { get; set; }
    
    public TaskAppService()
    {
        //3: 如果沒有提供Logger,就不能記錄日志
        Logger = NullLogger.Instance;
    }

    public void CreateTask(CreateTaskInput input)
    {
        //4: 記錄日志
        Logger.Info("Creating a new task with description: " + input.Description);

        //TODO: 保存到數據庫...
    }
}

  1. 導入Castle的ILogger接口的命名空間。
  2. 定義一個公有的叫做Logger的ILogger對象。這是記錄日志的對象。創建TaskAppService對象之后,依賴注入系統會設置(注入)這個屬性。這就是所謂的屬性注入模式。
  3. 將Logger設置為NullLogger.Instance。即使沒有這行代碼,系統也會工作地很好。但是這是屬性注入模式的最佳實踐。如果沒給Logger設置任何值,那么當我們使用它的時候會因為它是null而拋出“空指針”異常。這個保證了它不為null。因此,如果沒有給Logger設置值,那么它是NullLogger。這就是所謂的null對象模式。NullLogger實際上什么都沒做,也沒有記錄任何日志。因此,我們的類要不要一個實際的logger都能工作。
  4. 最后,我們記錄了一個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控制器和應用服務類提供了基類。比如,Web層對應的基類是XXXControllerBase(后綴為ControllerBase)。這些基類中都聲明了Logger屬性。因此你可以直接使用Logger來記錄日志,無需注入。例子:

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

注意,SimpleTaskSystemControllerBase是繼承了AbpController的應用基類控制器。因此,可以在控制器中直接使用Logger。Logger也存在於Web Api控制器的AbpApiController基類,以及應用服務層的基類(后綴為AppServiceBase的類)。你也可以為其他的類編寫自己的公共基類,這樣,你就不需要每次注入logger了。

配置

當你從ABP模板創建應用程序時,Log4Net的所有配置已經完成了。

默認的日志格式配置如下:

  • 日志級別: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是高度可配置的、健壯的日志記錄類庫。你可以使用不同的格式將日志記錄到不同的目標上(文本文件,數據庫等)。你也可以設置最小日志等級(正如此配置中為NHibernate配置的那樣)。你也可以記錄不同的日志到不同的文件中。當到達一個指定的大小時,它會自動備份並創建一個新的日志文件等等(本例中,滾動文件適配器的每個文件大小是10MB)。為了更好配置你的log4net,請查看官方文檔

最后,我們在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為客戶端定義了一個javascript日志記錄API。默認會將日志記錄到瀏覽器的控制台。記錄日志的javascript代碼樣例如下:

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

要查看javascript記錄日志的代碼,請留意后面的博客。


免責聲明!

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



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