本节内容:
服务端
ABP 使用 Castle Windsor 的日志记录工具,它可以和不同的 logginh(日志)类库协作:Log4Net、NLog、Serilog 等。Castle 为所有 Logger 库提供一个公共接口,所以它独立于 logging 库,也可以在有需要的时候很容易地替换 logging。
Log4Net 是最流行的 Logging 库,与适当配置后的 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 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 的控制器、应用服务类等提供了基类。它们声明一个 Logger 属性,所以你可以直接使用这个 Logger 写日志,不需要注入,例如:
- public class HomeController: SimpleTaskSystemControllerBase {
- public ActionResult Index() {
- Logger.Debug("A sample log message...");
- return View();
- }
- }
注意:SimpleTaskSystemControllerBase 是我们应用特定的继承自 AbpController 的基类。因此,它可以直接使用 Logger。同样,你也可以为你的其它类写公共基类,然后,你就不必每次注入 Logger 了。
配置
从创建的应用已经为 Log4Net 完成了所有的配置。
默认配置日志格式如下所示(每个一行)
它们在应用的 log4net.config 文件里定义,如下:
- "1.0"encoding = "utf-8" ? >"RollingFileAppender"type = "log4net.Appender.RollingFileAppender" > "Logs/Logs.txt" / >"true" / >"Size" / >"10" / >"10000KB" / >"true" / >"log4net.Layout.PatternLayout" > "%-5level %date [%-5.5thread] %-40.40logger - %message%newline" / >
- ref ref = "RollingFileAppender" / >"DEBUG" / >
- "NHibernate" > "WARN" / >
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(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(f = >f.UseAbpLog4Net().WithConfig("log4net.config"));
- base.Application_Start(sender, e);
- }
- }
唯的不同是我们使用 "UseAbpLog4Net()" 方法(定义在 Abp.Castle.Logging.Log4Net 命名空间里)替换 "UseLog4Net()"。当我们使用 Abp.Castle.Log4Net 包,就不再需要和包。
客户端
ABP 为客户端定义了一个简单的 Javascript logging Api,它默认在在浏览器的控制台上写日志,示例代码:
- abp.log.warn('a sample log message...');
更多信息,查看。
来源: http://www.cnblogs.com/kid1412/p/5987893.html