ABP框架 - 日志

文档目录

 

本节内容:

 

服务端

ABP使用Castle Windsor的日志记录工具,它可以和不同的logginh(日志)类库协作:Log4Net、NLog、Serilog等。Castle为所有Logger库提供一个公共接口,所以它独立于logging库,也可以在有需要的时候很容易地替换logging。

Log4Net是最流行的Logging库,ABP模板与适当配置后的Log4Net一起工作,但是它只是一个单行模式的依赖(查看“配置”主题),所以你可以替换成你喜欢的日志库。

 

获取Logger(记录器)

不管你用哪个logging库,写日志的代码是一样的(归功于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接口的命名空间。

其实,我们定义一个公开的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!

 

Logger的基类

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完成了所有的配置。

默认配置日志格式如下所示(每个一行)

  • Log级别: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是高度可配置,并强大的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 包

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-log4netCastle.Core-log4net包。

 

客户端

ABP为客户端定义了一个简单的Javascript logging Api,它默认在在浏览器的控制台上写日志,示例代码:

abp.log.warn('a sample log message...');

更多信息,查看logging API 文档

 

posted @ 2016-10-23 01:14 kid1412 阅读(...) 评论(...) 编辑 收藏