ABP框架 - 日志
本节内容:
服务端
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-log4net和Castle.Core-log4net包。
客户端
ABP为客户端定义了一个简单的Javascript logging Api,它默认在在浏览器的控制台上写日志,示例代码:
abp.log.warn('a sample log message...');
更多信息,查看logging API 文档。
ABP框架 - 日志的更多相关文章
- 过滤掉Abp框架不需要记录的日志
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 问题 ABP.WindowsService/Demo.MyJob/4.0.0该项目不仅 ...
- ABP框架实践基础篇之开发UI层
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...
- [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序
本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 手工搭建ABP框架(1) - Web项目
为了防止不提供原网址的转载,特在这里加上原文链接: http://www.cnblogs.com/skabyy/p/7295533.html ABP是 ASP.NET Boilerplate Proj ...
- ABP框架个人开发实战(1)_环境搭建
前言 之前关注ABP框架有一阵子了,一直没有潜下心来实际研究一下.最近想自己建站,以后有自己的功能开发项目,可以在自己的站点上开发,并一步步的完善,所以找个比较好用的框架迫在眉睫,选来选去,决定用AB ...
- 后台工作者HangFire与ABP框架Abp.Hangfire及扩展
HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便. HangFire是什么 Hangfire是一个开源框架(.NET ...
- ABP框架 - N层架构
目录 介绍 DDD分层 ABP架构模型 客户端 展现层 分布式服务层 应用层 领域层 基础设施层 介绍 在应用程序设计中,分层架构是一种被广泛使用的技术,它助于降低复杂度和提高代码的可重用性.在ABP ...
- [ABP]浅谈模块系统与 ABP 框架初始化
在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...
随机推荐
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...
- 前端学HTTP之web攻击技术
前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...
- [C#] 简单的 Helper 封装 -- SQLiteHelper
using System; using System.Data; using System.Data.SQLite; namespace SqliteConsoleApp { /// <summ ...
- 高频交易算法研发心得--MACD指标算法及应用
凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...
- 快递Api接口 & 微信公众号开发流程
之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...
- 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验
准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...
- pandas基础-Python3
未完 for examples: example 1: # Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEM ...
- 集合(set)-Python3
set 的 remove() 和 discard() 方法介绍. 函数/方法名 等价操作符 说明 所有集合类型 len(s) 集合基数:集合s中元素个数 set([obj]) 可变集合工 ...
- 新手学习web遇到的一些乱码问题
在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...
- 听H3絮叨:何以让天下没有难用的流程
最近朋友圈.网站新闻铺天盖地是"让天下没有难用的流程",有人就要问了,H3 BPM何德何能,为BPM站台,让天下没有难用的流程? 这是一个关于"办公室空想"的故 ...