ABP理论学习之日志记录
本篇目录
服务端###
ABP使用的是Castle Windsor的日志记录设备。它可以和不同的日志类库一起工作,比如Log4Net,NLog,Serilog等等。Castle为所有的日志类库提供了一个公共的接口。因此,你完全独立于特定的日志记录类库,而且,如果需要的话,你可以轻松地改变应用程序的日志类库。
Log4Net是.Net中最流行的日志类库之一。ABP模板中自带了经过合适配置的Log4Net。但是,只存在一行log4net的依赖(看下面),因此,你可以将它改为你最喜欢的类库。
获取Logger
无论你选择了什么日志类库,最终要记录的日志代码都是相同的(这得感谢Castle公共的ILogger接口)。
一开始,我们要处理一下记录日志的Logger对象。因为ABP强烈推荐使用依赖注入,所以我们可以使用属性注入模式轻松地注入一个Logger对象。如下所示:
using Castle.Core.Logging; //1: 导入 Logging 命名空间
public class TaskAppService : ITaskAppService
{
//2: 使用属性注入获得 logger
public ILogger Logger { get; set; }
public TaskAppService()
{
//3: 如果没有提供Logger,就不能记录日志
Logger = NullLogger.Instance;
}
public void CreateTask(CreateTaskInput input)
{
//4: 记录日志
Logger.Info("Creating a new task with description: " + input.Description);
//TODO: 保存到数据库...
}
}
- 导入Castle的ILogger接口的命名空间。
- 定义一个公有的叫做Logger的ILogger对象。这是记录日志的对象。创建TaskAppService对象之后,依赖注入系统会设置(注入)这个属性。这就是所谓的属性注入模式。
- 将Logger设置为NullLogger.Instance。即使没有这行代码,系统也会工作地很好。但是这是属性注入模式的最佳实践。如果没给Logger设置任何值,那么当我们使用它的时候会因为它是null而抛出“空指针”异常。这个保证了它不为null。因此,如果没有给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控制器和应用服务类提供了基类。比如,Web层对应的基类是XXXControllerBase(后缀为ControllerBase)。这些基类中都声明了Logger属性。因此你可以直接使用Logger来记录日志,无需注入。例子:
public class HomeController : SimpleTaskSystemControllerBase
{
public ActionResult Index()
{
Logger.Debug("A sample log message...");
return View();
}
}
注意,SimpleTaskSystemControllerBase是继承了AbpController的应用基类控制器。因此,可以在控制器中直接使用Logger。Logger也存在于Web Api控制器的AbpApiController基类,以及应用服务层的基类(后缀为AppServiceBase的类)。你也可以为其他的类编写自己的公共基类,这样,你就不需要每次注入logger了。
配置
当你从ABP模板创建应用程序时,Log4Net的所有配置已经完成了。
默认的日志格式配置如下:
- 日志级别: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="10" />
<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是高度可配置的、健壮的日志记录类库。你可以使用不同的格式将日志记录到不同的目标上(文本文件,数据库等)。你也可以设置最小日志等级(正如此配置中为NHibernate配置的那样)。你也可以记录不同的日志到不同的文件中。当到达一个指定的大小时,它会自动备份并创建一个新的日志文件等等(本例中,滚动文件适配器的每个文件大小是10MB)。为了更好配置你的log4net,请查看官方文档。
最后,我们在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为客户端定义了一个javascript日志记录API。默认会将日志记录到浏览器的控制台。记录日志的javascript代码样例如下:
abp.log.warn('a sample log message...');
要查看javascript记录日志的代码,请留意后面的博客。
ABP理论学习之日志记录的更多相关文章
- 过滤掉Abp框架不需要记录的日志
该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 问题 ABP.WindowsService/Demo.MyJob/4.0.0该项目不仅 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录
在开始之前,我们实现一个之前的遗留问题,这个问题是有人在GitHub Issues(https://github.com/Meowv/Blog/issues/8)上提出来的,就是当我们对Swagger ...
- ABP理论学习之Javascript API(理论完结篇)
返回总目录 本篇目录 Ajax Notification Message UI block和busy 事件总线 Logging 其他工具功能 说在前面的话 不知不觉,我们送走了2015,同时迎来了20 ...
- ABP(现代ASP.NET样板开发框架)系列之19、ABP应用层——审计日志
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之19.ABP应用层——审计日志 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- ABP理论学习之开篇介绍
返回总目录 为了和2016年春节赛跑,完成该系列博客,我牺牲了今天中午的时间来完成该系列的第一篇----开篇介绍.开篇介绍嘛,读过大学教材的同学都知道,这玩意总是那么无聊,跟考试没关系,干脆直接跳过, ...
- ABP理论学习之依赖注入
返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...
- ABP应用层——审计日志
ABP应用层——审计日志 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之19.ABP应用层——审计日志 ABP是“ASP.NET Boilerplate Pro ...
- Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...
- 前端学HTTP之日志记录
前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...
随机推荐
- ACM进阶计划
ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l ...
- Unity IOS Build的Graphics API最好是固定Opengl ES 2.0
不要选择Automatic也不要选择Metal,因为这个选项可能会导致app在Iphone6上出现crash. 一个类似的crash堆栈: http://stackoverflow.com/quest ...
- jsonp使用,spring4.x对jsonp的支持
1.Java中接口 @RequestMapping("/token/{token}") @ResponseBody public Object getUserByToken(@Pa ...
- C# 4.0四大新特性代码示例与解读
摘要:今天我们结合代码实例来具体看一下C#4.0中的四个比较重要的特性. 之前的文章中,我们曾介绍过C#的历史及C# 4.0新增特性,包括:dynamic. 命名和可选参数.动态导入以及协变和逆变等. ...
- Python爬虫学习(10):Selenium的好基友PhantomJS
上一节中我们学习了selenium,用python来操作浏览器,在做网页自动化测试的时候最好不过了 .如果我们来做爬虫用一个带界面的浏览器似乎不太好吧,那可咋办呢?别着急,下来我们要介绍的就是一款不带 ...
- ContactsUtil 工具类 - 转载
import java.util.HashMap; import java.util.Map; //http://www.open-open.com/code/view/1432300986802 / ...
- C++常用特性原理解析
在我的早期印象中,C++这门语言是软件工程发展过程中,出于对面向对象语言级支持不可或缺的情况下,一群曾经信誓旦旦想要用C统治宇宙的极客们妥协出来的一个高性能怪咖. 它驳杂万分,但引人入胜,出于多(mi ...
- 根据url下载图片
如题:在我要动手写的时候才发现不搜索根本就是写不出来,究其原因还是因为基础不扎实,由于用的少已经没有能力写出了 首先需要获取url数据流,然后写进文件里即可,仅仅两步可惜我写不出来啊跟着搜来的内容写一 ...
- Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传 ...
- phpstorm 10注释的双斜线位置不在缩进的位置:
22:07 2016/4/4phpstorm 10注释的双斜线位置不在缩进的位置:终于找到了(但是没有实现效果,不知道是什么原因 win10系统):File | Settings | Editor | ...