• .Net core的日志系统


    .net core是内置了日志系统的,本文这里简单的介绍一下它的基本用法。如下是一个简单的示例: 

    var service = new ServiceCollection()
        .AddLogging(logging => { logging.AddConsole(); });
     
    var provider   = service.BuildServiceProvider();
    var logFactory = provider.GetService<ILoggerFactory>();
    var logger     = logFactory.CreateLogger("MyLogger");
     
    logger.LogInformation("hello world. {0}", DateTime.Now);

    主要步骤如下:

    1. 在DI服务中通过AddLogging的配置日志服务
    2. 通过DI服务获取ILoggerFactory
    3. 通过日志工厂创建ILogger
    4. 通过ILogger写日志

    需要注意的是,日志是异步输出的,如果调用logger.LogInformation后程序马上结束,是不会有日志输出的。

    ILogger和ILogger<T>

    ILogger是我们实际用-来记录日志的对象,前面的例子已经演示了它的使用方法,在.net core日志系统中,还提供了另一个接口ILogger<T>,它的创建方式如下:

    var logger = logFactory.CreateLogger<Program>();
    

    ILogger<T>本身也是继承自ILogger的,也就是说,他们的用法基本一样,ILogger<T>的主要区别是创建的时候无需制定数据源名称,它的数据源就是类名,也就是说,它和如下方式创建的ILogger功能基本上是一致的。

    var logger = logFactory.CreateLogger(typeof(Program).FullName);
    

    那么为什么要创建一个ILogger<T>呢?我个人认为应为因为获取它是不需要制定参数,更容易和DI框架集成,我们可以通过如下代码获取ILogger<T>,而不需要先获取ILoggerFactory

    var logger = provider.GetService<ILogger<Program>>();
    

    日志结构

    .net core的日志系统支持不同的日志框架,并且对外统一了日志的格式,不管使用哪种库,它的格式是一样的。这样的好处是切换日志框架时,上层应用无需修改。一个基本的日志样例为:

    info: MyLogger[0]
    hello world. 03/23/2019 22:37:58

    它主要包括如下几个部分:

    • 日志级别 日志级别定义在LogLevel枚举中,它包含如下几个级别:Trace、Debug、Information、Warning、Error、Critical。另外还有一个特殊级别None,它的值比Critical还高,主要用于关闭日志输出, 当配置最小输出级别时None时,由于它的级别比Critical还高,则所有的日志都不会输出。
    • 日志源: 用于标志日志的数据源,它是一个字符串,保存在具体的ILog对象中,本例中就是"MyLogger"
    • 事件Id 它标志了日志的序列号,大部分的时候都不会用到它
    • 日志体: 日志内容

     

    日志提供程序

    ASP.NET Core 内置了如下几种日志提供程序:

    前面的示例中,如果要增加其他的日志提供程序,可以在DI框架初始化的时候进行。 

    var service = new ServiceCollection()
        .AddLogging(logging => { logging.AddConsole(); });
     
    var provider   = service.BuildServiceProvider();
    var logFactory = provider.GetService<ILoggerFactory>();
    var logger     = logFactory.CreateLogger("MyLogger");
     
    logger.LogInformation("hello world. {0}", DateTime.Now);

    虽然系统内置了这些日志框架比较方便,但实际上用起来是不够用的,比如说它不能输出到文件,不过好在.net core提供了比较强大的扩展机制,我们可以参考这篇文章使用第三方的日志提供程序输出到文件:Creating a rolling file logging provider for ASP.NET Core 2.0

    采用同样的方式,我们也可以使用NLog、Seriallog等更为专业的日志框架,甚至他们已经做好了适配,直接拿来用都可以。

    Log配置文件

    一个典型的日志系统的配置文件如下:

    {
        "Logging": { 
            "LogLevel": { // 
    表示全局 
                "Default""Warning" // 
    不指定CategoryName,应用于所有Category 
            },
            "Console": { // 
    指定 ProviderName,仅针对于 ConsoleProvider 
                "Default""Warning",
                "Microsoft""Error" // 
    指定CategoryNameMicrosoft的日志级别为Error
            }
        }
    }

    我们可以通过AddConfiguration函数指定日志配置文件: 

    var configBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
    var config        = configBuilder.Build();
    
    var service = new ServiceCollection()
        .AddLogging(logging =>
        {
            logging.AddConfiguration(config.GetSection("Logging"));
            logging.AddConsole();
        });

    参考文章:

  • 相关阅读:
    CentOS安装python setuptools and pip
    Memcached集群:Magent缓存代理使用
    PHP上传类 图片上传 upload class实现image crop resize 缩略图
    CentOS全自动一键安装PHP,MySQL,phpmyadmin与Nginx
    【转】浅析linux内存模型
    【转】深入浅出异步I/O模型
    【转】客户/服务器程序设计范式
    【转】如何保证睡眠的情况下把各种事情做好
    【转】非教育网中IPv4网络访问IPv6资源
    busybox介绍
  • 原文地址:https://www.cnblogs.com/TianFang/p/10590953.html
Copyright © 2020-2023  润新知