ABP使用的是Castle Windsor的 日志记录设备 。它可以和不同的日志类库一起工作,比如 Log4Net,NLog,Serilog等等 。Castle为所有的日志类库提供了一个 公共的接口 。因此,你完全独立于特定的日志记录类库,而且,如果需要的话,你可以轻松地改变应用程序的日志类库。
Log4Net 是.Net中最流行的日志类库之一。ABP模板中自带了经过合适配置的Log4Net。但是,只存在一行log4net的依赖(看下面),因此,你可以将它改为你最喜欢的类库。
无论你选择了什么日志类库,最终要记录的日志代码都是相同的(这得感谢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: 保存到数据库... } }
如果我们调用了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控制器和应用服务类提供了基类。比如,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的所有配置已经完成了。
默认的日志格式配置如下:
配置定义在应用的 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记录日志的代码,请留意后面的博客。