文档目录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 文档。