ABP之Logging

服务器端

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 包

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.

相关文章
相关标签/搜索