zoukankan      html  css  js  c++  java
  • ABP(现代ASP.NET样板开发框架)系列之8、ABP日志管理

    点这里进入ABP系列文章总目录

    基于DDD的现代ASP.NET开发框架--ABP系列之8、ABP日志管理

    ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。

    ABP的官方网站http://www.aspnetboilerplate.com

    ABP在Github上的开源项目https://github.com/aspnetboilerplate


    本文由东莞-天道提供翻译

    Server side(服务器端)

    ASP.NET Boilerplate使用Castle Windsor's logging facility日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等。对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方便的处理各种特殊的日志库,而且当业务需要的时候,很容易替换日志组件。

    译者注释:Castle是什么:Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西。ASP.NET Boilerplate的ioc容器就是通过Castle实现的。

    Log4Net 是asp.net下面最流行的一个日志库组件, ASP.NET Boilerplate 模板也使用了Log4Net日志库组件,但是呢,我们这里仅仅通过一行关键代码就实现Log4Net 的依赖注入(具体说明在下面的配置文件),所以,如果你想替换成自己的日志组件,也很容易。

    获取日志记录器logger

    不管你选择哪一个日志库组件,通过代码来进行日志记录都是一样的。(这里吐槽, Castle's 通用 ILogger 接口实在太牛逼了)。

    下面进入正题:(译者注:下面的代码是abp框架的Castle.Core源码分析以及实现)

    1、首先呢,我们要先处理日志记录器对象logger, ASP.NET Boilerplate框架使用了dependency injection依赖注入技术,我们可以很方便的使用依赖注入生成日志记录器对象logger。

    接下来我们看一下 ASP.NET Boilerplate是怎么实现日志记录功能的吧:

    using Castle.Core.Logging; //1: 导入日志的命名空间,Castle.Core.Logging
    public class TaskAppService : ITaskAppService { //2:通过依赖注入获取日志记录器对象。 这里先定义了一个ILogger类型的public属性Logger,这个对象就是我们用来记录日志的对象。在创建了TaskAppService对象(就是我们应用中定义的任务)以后,通过属性注入的方式来实现。 public ILogger Logger { get; set; } public TaskAppService() { //3: 如果没有日志记录器,将日志记录器返回一个空的实例,不写日志。这是依赖注入的最佳实现方式,
    // 如果你不定义这个空的日志记录器,当我们获取对象引用并且实例化的时候,就会产生异常。
    // 这么做,保证了对象不为空。所以,换句话说,不设置日志记录器,就不记录日志,返回一个null的对象。
    // NullLogger对象实际上什么都木有,空的。这么做,才能保证我们定义的类在实例化时正常运作。
    Logger = NullLogger.Instance; }
    public void CreateTask(CreateTaskInput input) { //4: 写入日志 Logger.Info("Creating a new task with description: " + input.Description);
    //TODO: save task to database...
    }
    }

    写入日志以后,我们可以查看日志文件,就像下面的格式:

    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

    ASP.NET Boilerplate框架提供了MVC Controllers、Web API Controllers和Application service classes的基类(自己定义的控制器和应用服务,都必须要继承ASP.NET Boilerplate的基类,换句话说,当你自定义的Web API controllers、mvc controllers,Application service classes都继承了ASP.NET Boilerplate框架对应的基类,你就可以直接使用日志记录器)。

    public class HomeController : SimpleTaskSystemControllerBase  
    { 
       public ActionResult Index() 
       { 
          Logger.Debug("A sample log message..."); 
          return View(); 
       } 
    } 

    说明:SimpleTaskSystemControllerBase这个基类控制器是我们自己定义的基类控制器,他必须继承自 AbpController。

    这样实现,日志记录器才能正常工作。当然了,你也可以实现自己的基类,这样的话你也可以不使用依赖注入了。

    配置

    如果你在官网上通过ASP.NET Boilerplate templates 来生成了你的工程,Log4Net的所有配置都自动生成了。

    默认的配置格式如下:

    • Log level: 日志记录等级,有DEBUG, INFO, WARN, ERROR or FATAL5个。
    • Date and time: 日志记录时间。
    • Thread number: 每行日志写时候的线程号。
    • Logger name: 日志记录器的名字,通常情况就是类名称。
    • Log text: 你写入的日志内容。

    配置文件:log4net.config 一般都在项目的web目录下面。

    <?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是一个非常强大和易用的日志库组件,你可以写各种日志,比如写到txt文件,写入到数据库等等。你能设置最小的日志等级,就像上面这个针对NHibernate的配置。不同的记录器写不同的日志,等等。

    具体的用法大家可以参照:http://logging.apache.org/log4net/release/config-examples.html

    最后,在工程的Global.asax 文件中,来定义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这个日志记录组件,工程中的Log4Net库是在 nuget package包中的,你也可以换成其他日志组件库,但是代码不用做任何改变。因为,我们的框架是通过依赖注入实现日志记录器的!

    Client side(客户端)

    最后,更厉害的是,你还可以在客户端调用日志记录器。在客户端,ASP.NET Boilerplate框架有对应的 javascript 日志API,这意味着你可以记录下来浏览器的日志,实现代码如下:

    abp.log.warn('a sample log message...'); 

    附上:客户端javascript的api,这里要说明的是,你可以使用console.log在客户端输出日志,但是这个API 不一定支持所有的浏览器,还有可能导致你的脚本出现异常,你可以使用我们的api,我们的是安全的,你甚至可以重载或者扩展这些api。

    abp.log.debug('...');
    abp.log.info('...');
    abp.log.warn('...');
    abp.log.error('...'); 
    abp.log.fatal('...');

    希望更多国内的架构师能关注到ABP这个项目,也许这其中有能帮助到您的地方,也许有您的参与,这个项目可以发展得更好。

    欢迎加ABP架构设计交流QQ群:134710707

    ABP架构设计交流群

     

    点这里进入ABP系列文章总目录

  • 相关阅读:
    DC中为什么要用Uniquify?
    hdu 1596 find the safest road
    hdu2112 HDU Today
    hdu 2066 一个人的旅行
    poj 3026 Borg Maze
    poj 1979 Red and Black
    poj 1321 棋盘问题
    hdu 1010 Tempter of the Bone
    hdu 4861 Couple doubi
    codeforces584B Kolya and Tanya
  • 原文地址:https://www.cnblogs.com/mienreal/p/4562078.html
Copyright © 2011-2022 走看看