ABP之Logging

服務器端

ABP使用Castle Windsor的日誌設施。它可使用不一樣的日誌庫:Log4Net、NLog、Serilog等等。Castle爲全部日誌程序庫提供了一個公共接口,這樣,咱們能夠獨立的使用某個日誌庫,而且隨時能夠變成另外的日誌庫。

web

Log4Net是.NET最流行的日誌庫之一,ABP模板附帶了可使用的Log4Net,Log4Net依賴項只有一行代碼(如配置部分所示),所以能夠輕鬆地將其更改成其餘想使用的庫。數據庫

獲取日誌記錄器

無論你使用哪一個日誌庫,,寫日誌的代碼是同樣的(多虧了Castle的通用ILogger接口)。瀏覽器

首先咱們須要得到一個Logger對象來編寫日誌,因爲ABP強烈的使用依賴注入,因此咱們可使用屬性注入(或構造函數注入)模式輕鬆地注入一個Logger對象。下面是一個寫日誌行的示例類:服務器

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接口的名稱空間;app

其次,咱們定義了一個名爲Logger的公共ILogger對象。這是咱們用來寫日誌的對象。依賴項注入系統將在建立TaskAppService對象後設置(注入)此屬性。這就是所謂的屬性注入模式;ide

第三,咱們將Logger設置爲NullLogger.Instance。沒有這條線,系統能夠很好地工做,可是使用屬性注入模式是最佳實踐。若是沒有人設置日誌程序,它將是null,當咱們想要使用它時,咱們將獲得一個「object reference…」異常。這保證了它不是null。所以,若是沒有人設置日誌記錄器,它將是NullLogger。這就是所謂的空對象模式。NullLogger實際上什麼也不作。它不寫任何日誌。這樣,咱們的類可使用或不使用實際的日誌記錄器。函數

最後,咱們正在編寫一個info級別的日誌文本。有不一樣的級別(請參閱配置部分)。工具

若是咱們調用CreateTask方法並檢查日誌文件,咱們會看到以下所示的日誌行:spa

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

ABP爲MVC控制器、WebAPI控制器、應用程序服務類等提供基類。它們聲明一個Logger屬性。這樣,就能夠直接使用這個日誌程序來編寫日誌,而不須要注入。例如:線程

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

注意,SimpleTaskSystemControllerBase是咱們的應用程序特定的基控制器,它繼承了AbpController。這樣,它就能夠直接使用日誌程序。還能夠爲其餘類編寫本身的公共基類。這樣您就沒必要每次都注入一個logger。

配置

當從ABP模板建立應用程序時,就會爲Log4Net完成全部配置。

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

 

日誌級別:調試、信息、警告、錯誤或致命。

日期和時間:日誌行被寫入的時間。

線程號:寫日誌行的線程號。

記錄器名稱:這一般是寫日誌行的類名稱。

日誌文本:您編寫的實際日誌文本。

它被定義在應用程序的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設置)。您能夠將不一樣的日誌記錄器寫入不一樣的日誌文件。當日志文件達到特定大小時,它能夠自動備份並建立一個新的日誌文件(在這個配置中,每一個文件的RollingFileAppender大小爲10000 KB),等等……閱讀它本身的配置文檔以得到更多信息。

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

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集成存在一個問題……它不支持最新的log4net。咱們建立了一個NuGet包,app . 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-log4net 和Castle.Core-log4net包.

若是你須要在運行時更改你的log4Net配置文件,並但願在不重啓應用程序的狀況下使更改當即生效,你可使用如下方法:

public class MvcApplication : AbpWebApplication
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        options.IocManager.IocContainer.AddFacility<LoggingFacility>(
            f => f.LogUsing(new Log4NetLoggerFactory("log4net.config", reloadOnChange:true))
        );
        base.Application_Start(sender, e);
    }
}

客戶端

ABP爲客戶端定義了一個簡單的JavaScript日誌API。它默認登陸到瀏覽器的控制檯。這裏有一些JavaScript代碼來寫日誌:

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

更多信息, 請看 logging API documentation.

相關文章
相關標籤/搜索