文档目录

本节内容:

服务端

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  -- ::, [    ] 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="" />
<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 文档

ABP框架 - 日志的更多相关文章

  1. 过滤掉Abp框架不需要记录的日志

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 问题 ABP.WindowsService/Demo.MyJob/4.0.0该项目不仅 ...

  2. ABP框架实践基础篇之开发UI层

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...

  3. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  4. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  5. 手工搭建ABP框架(1) - Web项目

    为了防止不提供原网址的转载,特在这里加上原文链接: http://www.cnblogs.com/skabyy/p/7295533.html ABP是 ASP.NET Boilerplate Proj ...

  6. ABP框架个人开发实战(1)_环境搭建

    前言 之前关注ABP框架有一阵子了,一直没有潜下心来实际研究一下.最近想自己建站,以后有自己的功能开发项目,可以在自己的站点上开发,并一步步的完善,所以找个比较好用的框架迫在眉睫,选来选去,决定用AB ...

  7. 后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便. HangFire是什么 Hangfire是一个开源框架(.NET ...

  8. ABP框架 - N层架构

    目录 介绍 DDD分层 ABP架构模型 客户端 展现层 分布式服务层 应用层 领域层 基础设施层 介绍 在应用程序设计中,分层架构是一种被广泛使用的技术,它助于降低复杂度和提高代码的可重用性.在ABP ...

  9. [ABP]浅谈模块系统与 ABP 框架初始化

    在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...

随机推荐

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

  2. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  3. 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位

    ASP.NET Core管道由注册的服务器和一系列中间件构成.我们在上一篇中深入剖析了中间件,现在我们来了解一下服务器.服务器是ASP .NET Core管道的第一个节点,它负责完整请求的监听和接收, ...

  4. QT5利用chromium内核与HTML页面交互

    在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...

  5. 第一个移动前端开源项目-dailog

    你还在为手机上没有忙碌光标而发愁吗?你还在抱怨弹出框组件要依赖zepto/jqery吗?你还在纠结是否要自己写一套还是去网上寻找成现成的UI组件吗?YouA为你轻松解决所有烦恼.YouA是我为移动前端 ...

  6. JQuery easyUI DataGrid 创建复杂列表头(译)

    » Create column groups in DataGrid The easyui DataGrid has ability to group columns, as the followin ...

  7. Oracle 数据库知识汇总篇

    Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...

  8. Java定时任务的常用实现

    Java的定时任务有以下几种常用的实现方式: 1)Timer 2)ScheduledThreadPoolExecutor 3)Spring中集成Cron Quartz 接下来依次介绍这几类具体实现的方 ...

  9. NPM如何更新到最新版

    参考文章--npm更新到最新版本的方法 其实我们可以这样,随便新建一个文件夹例如:F:\test.按着"shift"键,右键该文件夹,选择"在此处打开命令窗口(W)&qu ...

  10. iOS--->微信支付小结

    iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...