文檔目錄html
本節內容:數據庫
ABP使用Castle Windsor的日誌記錄工具,它能夠和不一樣的logginh(日誌)類庫協做:Log4Net、NLog、Serilog等。Castle爲全部Logger庫提供一個公共接口,因此它獨立於logging庫,也能夠在有須要的時候很容易地替換logging。瀏覽器
Log4Net是最流行的Logging庫,ABP模板與適當配置後的Log4Net一塊兒工做,可是它只是一個單行模式的依賴(查看「配置」主題),因此你能夠替換成你喜歡的日誌庫。app
無論你用哪一個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!
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完成了全部的配置。
默認配置日誌格式以下所示(每一個一行)
它們在應用的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,如上面的說法。但有一個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-log4net和Castle.Core-log4net包。
ABP爲客戶端定義了一個簡單的Javascript logging Api,它默認在在瀏覽器的控制檯上寫日誌,示例代碼:
abp.log.warn('a sample log message...');
更多信息,查看logging API 文檔。