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,如上所述。然而,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.