本篇目錄
服務端###
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: 保存到數據庫...
}
}
- 導入Castle的ILogger接口的命名空間。
- 定義一個公有的叫做Logger的ILogger對象。這是記錄日志的對象。創建TaskAppService對象之后,依賴注入系統會設置(注入)這個屬性。這就是所謂的屬性注入模式。
- 將Logger設置為NullLogger.Instance。即使沒有這行代碼,系統也會工作地很好。但是這是屬性注入模式的最佳實踐。如果沒給Logger設置任何值,那么當我們使用它的時候會因為它是null而拋出“空指針”異常。這個保證了它不為null。因此,如果沒有給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控制器和應用服務類提供了基類。比如,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記錄日志的代碼,請留意后面的博客。
