日志

服务端

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

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

获取记录器

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

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

  1. using Castle.Core.Logging; //1: Import Logging namespace
  2.  
  3. public class TaskAppService : ITaskAppService
  4. {
  5. //2: Getting a logger using property injection
  6. public ILogger Logger { get; set; }
  7.  
  8. public TaskAppService()
  9. {
  10. //3: Do not write logs if no Logger supplied.
  11. Logger = NullLogger.Instance;
  12. }
  13.  
  14. public void CreateTask(CreateTaskInput input)
  15. {
  16. //4: Write logs
  17. Logger.Info("Creating a new task with description: " + input.Description);
  18.  
  19. //TODO: save task to database...
  20. }
  21. }

  首先,我们引入了Castle`s ILogger接口命名空间。

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

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

  第四,也是最后,我们使用info级别写了一个日志文本。有不同的级别(参见配置部分)。

  如果我们调用CreateTask方法并检查日志文件,我们看见如下所示的一行日志:

  1. INFO -- ::, [ ] SimpleTaskSystem.Tasks.TaskAppService - Creating a new task with description: Remember to drink milk before sleeping!

日志基类

  ABP为MVC控制器、Web API控制器、应用服务类等提供了基类。他们声明了一个Logger属性。所以,可以直接使用这个Logger写日志,不需要注入。例如:

  1. public class HomeController : SimpleTaskSystemControllerBase
  2. {
  3. public ActionResult Index()
  4. {
  5. Logger.Debug("A sample log message...");
  6. return View();
  7. }
  8. }

  注意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文件,如下所示:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <log4net>
  3. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
  4. <file value="Logs/Logs.txt" />
  5. <appendToFile value="true" />
  6. <rollingStyle value="Size" />
  7. <maxSizeRollBackups value="10" />
  8. <maximumFileSize value="10000KB" />
  9. <staticLogFileName value="true" />
  10. <layout type="log4net.Layout.PatternLayout">
  11. <conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
  12. </layout>
  13. </appender>
  14. <root>
  15. <appender-ref ref="RollingFileAppender" />
  16. <level value="DEBUG" />
  17. </root>
  18. <logger name="NHibernate">
  19. <level value="WARN" />
  20. </logger>
  21. </log4net>

  Log4Net是高可配置且强日志类库。写日志可以使用不同的形式,而且可以写入不同的目的地(文本文件,数据库...)。可以设置最小的日志级别(如在本配置中为NHibernate设置)。可以将不同的日志写入到不同的日志文件。当达到指定大小时(在本配置中每个文件达到10000KB时会自动回卷文件适配器),它会自动备份并创建新的日志文件等等。阅读它自己的配置文档了解更多。

  最后,在Global.aspx文件中,我们声明Log4Net使用log4net.config文件:

  1. public class MvcApplication : AbpWebApplication
  2. {
  3. protected override void Application_Start(object sender, EventArgs e)
  4. {
  5. IocManager.Instance.IocContainer.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithConfig("log4net.config"));
  6. base.Application_Start(sender, e);
  7. }
  8. }

  这是我们依赖log4net仅有的一行代码。也只有web工程依赖log4net类库nuget包。所以,可以容易更改为另一个类库而不用更改日志代码。

Abp.Castle.Log4Net包

  ABP日志使用Castle日志设备,它不直接依赖于log4net ,如上声明的那样。但是Castle`s Log4Net集成有个问题,它不支持最新的log4net。我们创建了一个nuget包,Abp.Castle.Log4Net,解决这个问题。解决方案添加这个包之后,所有我们需要做的时在程序开始处像如下改变代码:

  1. public class MvcApplication : AbpWebApplication
  2. {
  3. protected override void Application_Start(object sender, EventArgs e)
  4. {
  5. IocManager.Instance.IocContainer.AddFacility<LoggingFacility>(f => f.UseAbpLog4Net().WithConfig("log4net.config"));
  6. base.Application_Start(sender, e);
  7. }
  8. }

  唯一的差别是我们使用“UseAbpLog4Net()”方法(定义在Abp.Castle.Logging.Log4Net命名空间)取代“UseLog4Net()”。当我们使用Abp.Castle.Log4Net包,不需要使用Castle.Windsor-log4net和Castle.Core-log4net包。

客户端

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

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

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

返回主目录

ABP官方文档翻译 2.4 日志的更多相关文章

  1. ABP官方文档翻译 4.6 审计日志

    审计日志 介绍 关于IAuditingStore 配置 通过特性启用/禁用 注意事项 介绍 维基百科:“审计追踪(也称为审计日志)是与安全相关的按时间先后的记录.记录集合.记录的目的地和源,提供一系列 ...

  2. 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  3. ABP官方文档翻译 10.1 ABP Nuget包

    ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...

  4. ABP官方文档翻译 7.3 Quartz集成

    Quartz集成 介绍 安装 创建Jobs 计划安排Jobs 更多 介绍 Quartz是一个全功能的.开源的job计划安排系统,可以用在小的apps也可以用于大型的企业系统.Abp.Quartz包简化 ...

  5. ABP官方文档翻译 7.1 后台Jobs和Workers

    后台Jobs和Workers 介绍 后台Jobs 关于Job持久化 创建后台Job 在队列中添加一个新Job 默认的后台Job管理器 后台Job存储 配置 禁用Job执行 异常处理 Hangfire集 ...

  6. ABP官方文档翻译 6.6 Javascript API

    JavaScript API AJAX 通知 消息 UI Block和Busy 事件总线 日志 其他实用功能 ABP提供了一套对象和函数,用来简化.标准化javascript的开发. 这里是ABP提供 ...

  7. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  8. ABP官方文档翻译 6.1.1 MVC控制器

    ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...

  9. ABP官方文档翻译 5.1 Web API控制器

    ASP.NET Web API控制器 介绍 AbpApiController基类 本地化 其他 过滤器 审计日志 授权 反伪造过滤器 工作单元 结果包装和异常处理 结果缓存 校验 模型绑定器 介绍 A ...

随机推荐

  1. HTML-网页常见错误

    400 请求出错  由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求.  HTTP 错误 401  401.1 未授权:登录失败  此错误表明传输给服务器的证书与登录服务器所 ...

  2. 【BZOJ3653】谈笑风生 离线+树状数组+DFS序

    [BZOJ3653]谈笑风生 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”. ? 设a 和 ...

  3. jenkins提交SVN文件

    需求背景: 公司有内网和外网两台SVN服务器,都需要维护相同的配置文件,但是我们想能否在内网修改配置文件后同时提交到外网SVN服务器上. 开发人员操作步骤 1.开发人员在IDE中checkout内网c ...

  4. centos免密登录

    本文是为了docker-machine增加现有虚拟机服务器为节点而做 docker-machine create -d generic --generic-ip-address=192.168.102 ...

  5. Python全栈day10(基本数据类型及其常用方法)

    一,数字 1,int 将字符串转化成数字 a = '123' b=int(a) b=123 2,以进制方式进行转换 num="a" >>> num = " ...

  6. java面试基础题------》Java 中的final关键字有哪些用法

    (1)修饰类:表示该类不能被继承: (2)修饰方法:表示方法不能被重写: (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量).

  7. 解决Bat脚本中包含中文,运行乱码

    bat文件右键用“编辑” 打开, 另存为时,UTF-8保存为ANSI 格式.即可解决运行时乱码问题.

  8. golang zlib 压缩,解压缩

    package main import ( "bytes" "compress/zlib" "fmt" "io" &qu ...

  9. python 面向对象(进阶篇)转载武沛齐

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  10. pendingIntent的FLAG标签:

    PendingIntent是一个特殊的Intent,实际上它像一个邮包,其中包裹着真正的Intent,当邮包未打开时,Intent是被“挂起”的,所以并不执行, 只有当邮包拆开时才会执行.它与Inte ...