ABP官方文档翻译 2.4 日志
日志
服务端
ABP使用Castle Windsor`s 日志设备。它可以使用不同的日志类库:Log4Net,Nlog,Serilog...等等。Castle提供了所有记录器类库的通用接口。所以,它独立于特定的日志类库,并且如果需要可以很方便的更换它。
Log4Net是.NET最流行的日志类库之一。ABP模板已经配置了Log4Net,可直接使用。ABP仅有一行log4net的配置代码(如在配置部分所见),所以可以轻松的更换为自己喜欢的类库。
获取记录器
不管选择哪种类库,写日志的代码是一样的(感谢Castle`s通用ILogger接口)。
首先,我们呢应该有一个记录器对象写日志。因为ABP强烈要求使用依赖注入,我们可以使用属性注入(或构造注入)一个记录器对象。请看下面的写了一行日志例子:
- 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`s ILogger接口命名空间。
第二,我们定义了名为Logger的公共ILogger对象。我们将使用这个对象写日志。创建TaskAppService对象后,依赖注入系统将设置(注入)这个属性。这就是所熟知的属性注入模式。
第三,我们设置Logger为NullLogger.Instance。没有这行系统也会正常工作。但是这是属性注入模式的最佳实践。如果没有设置Logger,它将会为null,当我们使用它的时候回得到“object reference...”异常。这保证了它不会为null。所以,如果没有设置Logger,它将会是NullLogger。这是所熟知的null对象模式。NullLogger实际上什么也没做,不会写任何日志。然而,我们的类可以使用它正常工作,实际上并没有记录器。
第四,也是最后,我们使用info级别写了一个日志文本。有不同的级别(参见配置部分)。
如果我们调用CreateTask方法并检查日志文件,我们看见如下所示的一行日志:
- INFO -- ::, [ ] SimpleTaskSystem.Tasks.TaskAppService - Creating a new task with description: Remember to drink milk before sleeping!
日志基类
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形式如下(每一行):
- LogLevel:DEBUG,INFO,WARN,ERROR or FATAL。
- Date and Time:当日志行写入时的时间。
- Thread number:写日志行的线程编码。
- Logger name:通常为写日志行类的名称。
- Log text:实际要写入的日志文本。
这些定义在应用的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设置)。可以将不同的日志写入到不同的日志文件。当达到指定大小时(在本配置中每个文件达到10000KB时会自动回卷文件适配器),它会自动备份并创建新的日志文件等等。阅读它自己的配置文档了解更多。
最后,在Global.aspx文件中,我们声明Log4Net使用log4net.config文件:
- 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`s Log4Net集成有个问题,它不支持最新的log4net。我们创建了一个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日志API。它默认记录到浏览器控制台。JavaScript写日志示例代码如下:
- abp.log.warn('a sample log message...');
了解更多信息,参见logging API文档。
ABP官方文档翻译 2.4 日志的更多相关文章
- ABP官方文档翻译 4.6 审计日志
审计日志 介绍 关于IAuditingStore 配置 通过特性启用/禁用 注意事项 介绍 维基百科:“审计追踪(也称为审计日志)是与安全相关的按时间先后的记录.记录集合.记录的目的地和源,提供一系列 ...
- 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- 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 ...
- ABP官方文档翻译 7.3 Quartz集成
Quartz集成 介绍 安装 创建Jobs 计划安排Jobs 更多 介绍 Quartz是一个全功能的.开源的job计划安排系统,可以用在小的apps也可以用于大型的企业系统.Abp.Quartz包简化 ...
- ABP官方文档翻译 7.1 后台Jobs和Workers
后台Jobs和Workers 介绍 后台Jobs 关于Job持久化 创建后台Job 在队列中添加一个新Job 默认的后台Job管理器 后台Job存储 配置 禁用Job执行 异常处理 Hangfire集 ...
- ABP官方文档翻译 6.6 Javascript API
JavaScript API AJAX 通知 消息 UI Block和Busy 事件总线 日志 其他实用功能 ABP提供了一套对象和函数,用来简化.标准化javascript的开发. 这里是ABP提供 ...
- ABP官方文档翻译 6.2.1 ASP.NET Core集成
ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...
- ABP官方文档翻译 6.1.1 MVC控制器
ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...
- ABP官方文档翻译 5.1 Web API控制器
ASP.NET Web API控制器 介绍 AbpApiController基类 本地化 其他 过滤器 审计日志 授权 反伪造过滤器 工作单元 结果包装和异常处理 结果缓存 校验 模型绑定器 介绍 A ...
随机推荐
- HTML-网页常见错误
400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证书与登录服务器所 ...
- 【BZOJ3653】谈笑风生 离线+树状数组+DFS序
[BZOJ3653]谈笑风生 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”. ? 设a 和 ...
- jenkins提交SVN文件
需求背景: 公司有内网和外网两台SVN服务器,都需要维护相同的配置文件,但是我们想能否在内网修改配置文件后同时提交到外网SVN服务器上. 开发人员操作步骤 1.开发人员在IDE中checkout内网c ...
- centos免密登录
本文是为了docker-machine增加现有虚拟机服务器为节点而做 docker-machine create -d generic --generic-ip-address=192.168.102 ...
- Python全栈day10(基本数据类型及其常用方法)
一,数字 1,int 将字符串转化成数字 a = '123' b=int(a) b=123 2,以进制方式进行转换 num="a" >>> num = " ...
- java面试基础题------》Java 中的final关键字有哪些用法
(1)修饰类:表示该类不能被继承: (2)修饰方法:表示方法不能被重写: (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量).
- 解决Bat脚本中包含中文,运行乱码
bat文件右键用“编辑” 打开, 另存为时,UTF-8保存为ANSI 格式.即可解决运行时乱码问题.
- golang zlib 压缩,解压缩
package main import ( "bytes" "compress/zlib" "fmt" "io" &qu ...
- python 面向对象(进阶篇)转载武沛齐
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- pendingIntent的FLAG标签:
PendingIntent是一个特殊的Intent,实际上它像一个邮包,其中包裹着真正的Intent,当邮包未打开时,Intent是被“挂起”的,所以并不执行, 只有当邮包拆开时才会执行.它与Inte ...