zoukankan      html  css  js  c++  java
  • 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  2014-07-13 13:40:23,360 [8    ] 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文档

    返回主目录

  • 相关阅读:
    内嵌补丁(洞穴代码)
    攻防世界--game
    攻防世界--re1
    upx压缩notepad.exe(运行时压缩)
    crack Tut.ReverseMe1.exe
    HBuilder创建app 基础
    MongoDB 之pymongodb
    MongoDB 基础
    flask POOL,websocket握手
    flask flask_session,WTForms
  • 原文地址:https://www.cnblogs.com/xajh/p/6786596.html
Copyright © 2011-2022 走看看