记录(日志)

服务器端

ASP.NET Boilerplate使用Castle Windsor的日志工具它可以与不同的日志库一起使用:Log4NetNLogSerilog等。Castle 为所有记录器库提供了通用接口这样,您就可以独立于特定的日志记录库,并且可以在以后根据需要轻松更改它。

Log4Net是.NET最流行的日志库之一。ASP.NET Boilerplate 模板随Log4Net正确配置并可随时使用。对于log4net的依赖只有一行代码(如配置部分所示),因此您可以轻松地将其更改为您喜欢的库。

获取记录器

无论您选择哪个日志库,编写日志的代码都是相同的(感谢Castle的常见ILogger接口)。

首先,我们需要获取Logger对象来写日志。由于ASP.NET Boilerplate强烈使用依赖注入,我们可以使用属性注入 (或构造函数注入)模式轻松注入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接口的命名空间。

其次,我们定义了一个名为Logger 的公共ILogger对象。这是我们用日志写的对象。依赖注入系统将在创建TaskAppService对象后设置(注入)此属性。这被称为属性注入模式。

第三,我们将Logger设置为NullLogger.Instance没有这一行,系统将正常工作,但最佳做法是使用属性注入模式。如果没有人设置Logger,它将为null,当我们想要使用它时,我们将获得“对象引用...”异常。这可以保证它不为空。因此,如果没有人设置Logger,它将是NullLogger。这称为空对象模式。NullLogger实际上什么也没做。它不会写任何日志。这样,我们的类可以使用和不使用实际的记录器。

最后,我们正在编写一个包含信息级别的日志文本有不同的级别(请参阅配置部分)。

如果我们调用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!

使用记录器的基类

ASP.NET Boilerplate 为MVC控制器,Web API控制器,应用程序服务类等提供基类他们声明了Logger属性。这样,您可以直接使用此Logger编写日志,无需注入。例:

public class HomeController : SimpleTaskSystemControllerBase
{
    public ActionResult Index()
    { 
        Logger.Debug("A sample log message...");
        return View();
    }
}

请注意,SimpleTaskSystemControllerBase是我们的应用程序特定的基本控制器,它继承了AbpController。这样,它可以直接使用Logger。您还可以为其他类编写自己的公共基类。然后,您不必每次都注入记录器。

组态

当您从ASP.NET Boilerplate 模板创建应用程序时,所有配置都是为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设置)。您可以将不同的记录器写入不同的日志文件。它可以在达到特定大小时自动备份和创建新的日志文件(在此配置中每个文件的滚动文件适配器为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 Logging Facility进行日志记录,它不直接依赖于log4net,如上所述。但是,Castle的Log4Net集成存在问题......它不支持最新的log4net。我们创建了一个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 包。

客户端

ASP.NET Boilerplate为客户端定义了一个简单的JavaScript日志记录API。它默认记录到浏览器的控制台。这是一些用于编写日志的JavaScript代码:

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

有关更多信息,请参阅日志记录API文档

nidie.com.cn - 用心与你沟通