您的位置:首页 > 其它

ABP官方文档翻译 2.4 日志

2017-04-30 00:19 489 查看
[b]日志[/b]

服务端

获取记录器

基类日志记录器

配置

Abp.Castle.Log4Net包

客户端

服务端

  ABP使用Castle Windsor`s 日志设备。它可以使用不同的日志类库:Log4Net,Nlog,Serilog...等等。Castle提供了所有记录器类库的通用接口。所以,它独立于特定的日志类库,并且如果需要可以很方便的更换它。

  Log4Net是.NET最流行的日志类库之一。ABP模板已经配置了Log4Net,可直接使用。ABP仅有一行log4net的配置代码(如在配置部分所见),所以可以轻松的更换为自己喜欢的类库。

获取记录器

  不管选择哪种类库,写日志的代码是一样的(感谢Castle`s通用ILogger接口)。

  首先,我们呢应该有一个记录器对象写日志。因为ABP强烈要求使用依赖注入,我们可以使用属性注入(或构造注入)一个记录器对象。请看下面的写了一行日志例子:

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`s ILogger接口命名空间。

  第二,我们定义了名为Logger的公共ILogger对象。我们将使用这个对象写日志。创建TaskAppService对象后,依赖注入系统将设置(注入)这个属性。这就是所熟知的属性注入模式。

  第三,我们设置Logger为NullLogger.Instance。没有这行系统也会正常工作。但是这是属性注入模式的最佳实践。如果没有设置Logger,它将会为null,当我们使用它的时候回得到“object reference...”异常。这保证了它不会为null。所以,如果没有设置Logger,它将会是NullLogger。这是所熟知的null对象模式。NullLogger实际上什么也没做,不会写任何日志。然而,我们的类可以使用它正常工作,实际上并没有记录器。

  第四,也是最后,我们使用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的配置都完成了。

  默认配置的Log形式如下(每一行):

LogLevel:DEBUG,INFO,WARN,ERROR or FATAL。

Date and Time:当日志行写入时的时间。

Thread number:写日志行的线程编码。

Logger name:通常为写日志行类的名称。

Log text:实际要写入的日志文本。

  这些定义在应用的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设置)。可以将不同的日志写入到不同的日志文件。当达到指定大小时(在本配置中每个文件达到10000KB时会自动回卷文件适配器),它会自动备份并创建新的日志文件等等。阅读它自己的配置文档了解更多。

  最后,在Global.aspx文件中,我们声明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`s 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包。

客户端

  ABP定义了为客户端定义了一个简单的JavaScript日志API。它默认记录到浏览器控制台。JavaScript写日志示例代码如下:

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


  了解更多信息,参见logging API文档

返回主目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: