• ASP.NET 5 入门 (3) – Logging


    原文转载自:http://www.cnblogs.com/zergcom/p/4527779.html

    ASP.NET 5 入门 (3) – Logging

    前几天就关注到汤姆大叔的相关文档: 解读ASP.NET 5 & MVC6系列(9):日志框架.

    讲的已经很清楚了, 这里就不加累述了,那么换一个角度,在实现方案和代码开发方面谈下自己的理解.

    理解ASP.NET5的Logging

    ASP.NET 5的Logging我认为其实就是2句话:

    • Logging的使用: 应用内部的Logging统一使用Microsoft.Framework.Logging接口.
    • Logging的实现: 通过不同的代理类向不同的Logging实现技术分发应用内部产生的Log.

    Logging的使用其实就是依托2个基本接口:  ILogger和ILoggerFactory.

    Logging的实现其实就是通过实现不同的ILoggerProvider代理接口和其他技术对接.

    如果还是不明白可以看下目前Microsoft.Framework.Logging的源码,就清楚了:

    https://github.com/aspnet/Logging/tree/dev/src

     

                           

    我们可以看到Abstractions就是Logging的通用接口,而Console, Nlog和TraceSouce就是3个内部提供的代理类.目前能够使用的只有Console和TraceSource代理, 而NLog并没有提交, 不过根据这里面的代码,我相信针对其他Logging技术比如Log4Net,Serilog的代理类也并不难实现.

    如何使用通用Logging框架

    使用Logging框架一共分3步:

    1. 使用依赖注入获取ILoggerFactory实现.
    2. 利用ILoggerFactory构建ILogger实例
    3. 使用ILogger实例输出Log信息.

    我们还是以最经典的Startup的Configurate函数为例:

    复制代码
    public void Configure(IApplicationBuilder app)
       {
         //利用最简单的GetService函数获取通过依赖注入获取ILoggerFactory实现
         var loggerfactory = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory));
         //创建logger实例
         var logger = loggerfactory.CreateLogger<Startup>();
         //输出一条Log信息
         logger.LogWarning("这是一条警告信息");
         }
    复制代码


    那么这些输出的Log信息在那里显示呢,除了VS调试环境,很遗憾没有任何地方能看到这些信息,这是因为标准的Logging实现不实现任何输出,如果要想输出,必须加入各种代理类把Log分发出去.

    加入Console代理

    首先我们加入引用:

    "Microsoft.Framework.Logging.Console": "1.0.0-beta4"

    其次我们加入如下代码

    var loggerfactory = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory));
    // 加入Console代理
    loggerfactory.AddConsole(minLevel:LogLevel.Information);


    代理在加入在项目中只需要加一次,一般就在Configure函数中加入即可. 加入以上代码以后,所有从通用接口分发的Log信息都会显示在程序控制台上面,当然由于设置了minLevel属性,仅仅高于或等于Information等级的信息才会被显示.

    加入TraceSource代理

    如果仅仅是在控制台显示显然是不过瘾的,一般来说,我们会把log输出到文件,在目前的情况下我们只能通过TraceSource代理吧Log输出到文件. TraceSource是System.Diagnostics中的主要内容,大家应该并不陌生.

    首先我们还是需要加入一些组件

    "Microsoft.Framework.Logging.TraceSource": "1.0.0-beta4"

    如果要让Core 5.0也支持,还必须加入

    "System.Diagnostics.TextWriterTraceListener": "4.0.0-beta-22816"

    实现的代码是(开发时自行加入所需的using语句):

    复制代码
    var loggerfactory = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory));
    
    // Add trace source logger
    var logFileStream = new FileStream("app.log", FileMode.Append);
    var traceListenter = new TextWriterTraceListener(logFileStream)
    {
         Filter = new EventTypeFilter(SourceLevels.Error | SourceLevels.Critical)
    };
    var source = new SourceSwitch("AppLog")
    {
          Level = SourceLevels.All
    };
    loggerfactory.AddTraceSource(source, traceListenter);
    复制代码


    根据以上代码,所有Error和Critical的Log信息会被输出到当前目录的app.log文件中去,如果要显示更多等级的信息请自行修改Filter.

    该代理和Console一样,也只需要运行一次,同样建议在Configurate中运行.

    其他代理的实现展望

    其他的代理类目前是没有比较完整的实现,但我们可以预见到后续的实现方法其实并不难,就是:

    • 首先引入你使用的第三方Log实现,比如Log4Net,NLog,Serilog等.
    • 然后引入或者自行开发代理类, 一般这个代理类会为ILoggerFactory实现一个扩展函数 AddXXX() : 比如AddNlog , AddLog4Net , AddSeriLog 等等.
    • 最后在Configutate函数中调用这个扩展函数AddXXX() 函数把标准Logging分发到该第三方Log实现.

    这就是目前ASP.NET 5 所提供的Logging分发思路和实现方案.

  • 相关阅读:
    JavaEE--JNDI(下,实现)
    JavaEE--JNDI(上,简介)
    JavaSE--java是值传递还是引用传递
    Mysql--主库不停机搭建备库
    MySQL--从库启动复制报错1236
    JVM·垃圾收集器与内存分配策略之垃圾收集器!
    mysql·事务挂起
    hash·余数hash和一致性hash
    关于正则效率问题(正则导致程序卡死)
    JVM·参数配置
  • 原文地址:https://www.cnblogs.com/lonel-yboy/p/5437696.html
Copyright © 2020-2023  润新知