首页 技术 正文
技术 2022年11月15日
0 收藏 735 点赞 4,400 浏览 2773 个字

.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[]
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” // 指定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();
});

参考文章:

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,948
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,474
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,287
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,102
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,734
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,769