博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP框架 - 日志
阅读量:7062 次
发布时间:2019-06-28

本文共 3516 字,大约阅读时间需要 11 分钟。

 

本节内容:

 

服务端

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

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

 

获取Logger(记录器)

不管你用哪个logging库,写日志的代码是一样的(归功于Castle的公共ILogger接口)。

首先,我们应获取一个Logger,由于ABP大量使用,所以我们可以用属性注入(或构造器注入)模式来注入一个Logger对象。看一下写一行日志的示例类:

using Castle.Core.Logging; //1: Import Logging namespacepublic 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了。

 

配置

从创建的应用已经为Log4Net完成了所有的配置。

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

  • Log级别:DEBUG,INFO,WARN,ERROR,或FATAL。
  • 日期和时间:写日志时的日期时间。
  • 线程号:写日志的线程的线程号。
  • Logger名称:通常是写日志的类名。
  • 日志文本:你实质上写日志文本。

它们在应用的log4net.config文件里定义,如下:

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
(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
(f => f.UseAbpLog4Net().WithConfig("log4net.config")); base.Application_Start(sender, e); } }

唯的不同是我们使用“UseAbpLog4Net()“方法(定义在Abp.Castle.Logging.Log4Net命名空间里)替换”UseLog4Net()“。当我们使用Abp.Castle.Log4Net包,就不再需要和包。

 

客户端

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

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

更多信息,查看。

 

转载地址:http://yzill.baihongyu.com/

你可能感兴趣的文章
java中关于继承的问题
查看>>
认证服务号可通过模板消息向用户发送重要的服务通知
查看>>
OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)
查看>>
Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理
查看>>
iOS - UIActionSheet
查看>>
用户 'IIS APPPOOL\xxxx' 登录失败
查看>>
iOS - TouchID 指纹识别
查看>>
centos7上安装redis
查看>>
【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)
查看>>
(转) Face-Resources
查看>>
虚拟机克隆后找不到eth0
查看>>
MySQL案例-show fileds from 提示无权限
查看>>
Oracle推导参数Derived Parameter介绍
查看>>
解决TCP网络传输“粘包”问题
查看>>
【中亦安图】Oracle内存过度消耗风险提醒(6)
查看>>
OSS控制台新增函数计算处理事件入口
查看>>
第一章——计算机系统架构介绍
查看>>
Struts2.5使用通配符的方式实现动态方法调用报错
查看>>
【MySQL】replace into 浅析之一
查看>>
HDOJ(HDU) 2519 新生晚会(组合公式)
查看>>