文档目录

本节内容:

服务端

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. 通过一个demo了解Redux

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...

  2. [Java 缓存] Java Cache之 DCache的简单应用.

    前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...

  3. Dreamweaver 扩展开发:C-level extensibility and the JavaScript interpreter

    The C code in your library must interact with the Dreamweaver JavaScript interpreter at the followin ...

  4. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  5. C#项目中文件的具体含义

    1.Bin 目录 用来存放编译的结果,bin是二进制binary的英文缩写,因为最初C编译的程序文件都是二进制文件,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin ...

  6. RSA算法

    RSA.h #ifndef _RSA_H #define _RSA_H #include<stdio.h> #include<iostream> #include<mat ...

  7. CSS3新特性应用之结构与布局

    一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...

  8. FineReport:任意时刻只允许在一个客户端登陆账号的插件

    在使用FineReport报表系统中,处于账户安全考虑,有些企业希望同一账号在任意时刻智能在统一客户端登录.那么当A用户在C1客户端登陆后,该账号又在另外一个C2客户端登陆,服务器如何取判断呢? 开发 ...

  9. DDD设计中的Unitwork与DomainEvent如何相容?

    最近在开发过程中,遇到了一个场景,甚是棘手,在这里分享一下.希望大家脑洞大开一起来想一下解决思路.鄙人也想了一个方案拿出来和大家一起探讨一下是否合理. 一.简单介绍一下涉及的对象概念 工作单元:维护变 ...

  10. Jexus服务器SSL二级证书安装指南

    申请获得服务器证书有三张,一张服务器证书,二张中级CA证书.在Android微信中访问Https,如果服务器只有一张CA证书,就无法访问. 获取服务器证书中级CA证书: 为保障服务器证书在客户端的兼容 ...