ASP.NET Core的日志系统介绍

2022-07-07 19:45:55

.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);

主要步骤如下:

    在DI服务中通过AddLogging的配置日志服务

    通过DI服务获取ILoggerFactory

    通过日志工厂创建ILogger

    通过ILogger写日志

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

    ILogger和ILogger<T>

    ILogger是我们实际用-来记录日志的对象,前面的例子已经演示了它的使用方法,在.net>

    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>

    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>

        控制台

        调试

        EventSource

        EventLog

        TraceSource

        前面的示例中,如果要增加其他的日志提供程序,可以在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提供了比较强大的扩展机制。

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

          elmah.io

          Gelf

          JSNLog

          KissLog.net

          Loggr

          NLog

          Sentry

          Serilog

          Stackdriver

          Log配置文件

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

          {
              "Logging": { 
                  "LogLevel": { // 表示全局 
                      "Default": "Warning" // 不指定CategoryName,应用于所有Category 
                  },
                  "Console": { // 指定 ProviderName,仅针对于 ConsoleProvider 
                      "Default": "Warning",
                      "Microsoft": "Error" // 指定CategoryName为Microsoft的日志级别为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();
              });

          到此这篇关于ASP.NET Core日志系统的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易采站长站。