1.前言

ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API。本文介绍了如何将日志记录API与内置提供应用程序一起使用。

2.添加日志提供程序

日志记录提供应用程序显示或存储日志。例如,控制台提供应用程序在控制台上显示日志,Azure Application Insights提供应用程序将这些日志存储在Azure Application Insights中。要添加提供应用程序,请在Program.cs中调用提供程序的Add{provider name}扩展方法:

public static void Main(string[] args)
{
var webHost = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json",
optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
})
.ConfigureLogging((hostingContext, logging) =>
{
//添加appsettings.json中关于日志的Logging节点配置
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
//日志控制台记录提供程序
logging.AddConsole();
//日志Debug记录提供程序
logging.AddDebug();
//日志EventSource记录提供程序
logging.AddEventSourceLogger();
})
.UseStartup<Startup>()
.Build();
webHost.Run();
}

默认项目模板调用CreateDefaultBuilder,该操作将添加日志记录(控制台、DEBUG、EventSource)提供给应用程序:

public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();

3.创建日志

创建日志可以从依赖注入(DI)中获取ILogger<TCategoryName>对象。以下Razor页面示例会创建级别为Information且类别为AboutModel类(Models/AboutModel)的日志:

public class AboutModel
{
private readonly ILogger _logger;
public AboutModel(ILogger<AboutModel> logger)
 {
  //ILogger是Core内置日志组件,默认已经注入,无需再次手动注入
_logger = logger;
}
public void OnGet()
{
var Message = $"About page visited at {DateTime.UtcNow.ToLongTimeString()}";
_logger.LogInformation("Message displayed: {Message}", Message);
}
}
private readonly ILogger<AboutModel> _logger;
public HomeController(ILogger<AboutModel> logger)
{
_logger = logger;
}
public IActionResult Index()
{
AboutModel aboutModel = new AboutModel(_logger);
aboutModel.OnGet();
return View();
}

通过Kestral服务器启动调试:

看看控制台输出日志记录:

日志“级别”代表所记录事件的严重程度。日志“类别”是与每个日志关联的字符串。ILogger<T>实例会创建“类别”为类型T的完全限定名称的日志。

3.1启动时(Startup)创建日志

要将日志写入Startup类,构造函数签名需包含ILogger参数:

public class Startup
{
private readonly ILogger _logger;
public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
_logger = logger;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
_logger.LogInformation("Added TodoRepository to services");
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
_logger.LogInformation("In Development environment");
}
}
}

通过Kestral服务器启动调试看看控制台输出日志记录:

3.2在程序中(Program)创建日志

如果使用CreateDefaultBuilder,则可自行选择提供应用程序来替换默认应用程序。调用 ClearProviders,然后添加所需的应用程序。

public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
var logger = host.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("Seeded the database.");
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
});
}

通过Kestral服务器启动调试看看控制台输出日志记录:

4.Configuration

日志记录提供程序配置由一个或多个配置提供程序提供:
●文件格式(INI、JSON 和 XML)。
●命令行参数。
●环境变量。
●内存中的.NET对象。
●未加密的机密管理器存储。
●加密的用户存储,如 Azure Key Vault。
●(已安装或已创建的)自定义提供程序。
例如,日志记录配置通常由应用设置文件的Logging部分提供。以下示例显示了典型 appsettings.Development.json 文件的内容:

{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
},
"Console":
{
"IncludeScopes": true
}
}
}

Logging属性可具有LogLevel和日志提供程序属性(显示控制台)。Logging下的LogLevel属性指定了用于记录所选类别的最低级别。在本例中,System和Microsoft类别在Information级别记录,其他均在Debug级别记录。如果提供程序支持日志作用域,则IncludeScopes将指示是否启用这些域。

5.日志级别

每个日志都指定了一个LogLevel值。日志级别指示严重性或重要程度。如果LogLevel是Warning级别,那么跟踪Trace,Debug,Information级别将不会记录。ASP.NET Core 定义了以下日志级别(按严重性从低到高排列): 
●跟踪Trace = 0
●调试Debug = 1
●信息 Information = 2
●警告 Warning = 3
●错误 Error = 4
●严重 Critical = 5

6.内置日志记录提供程序

●控制台:logging.AddConsole(); dotnet run 查看控制台日志记录输出。  
●调试:logging.AddDebug(); 在 Linux 中,此提供程序将日志写入 /var/log/message。
●EventSource:logging.AddEventSourceLogger();在Windows中,它使用PerfView实用工具收集和查看日志,但尚无支持Linux或macOS的事件集合和显示工具。
●EventLog:logging.AddEventLog();向Windows事件日志发送日志输出。
●TraceSource:logging.AddTraceSource(sourceSwitchName);应用必须在.NET Framework(而非.NET Core)上运行。

7.第三方日志记录提供程序

适用于ASP.NET Core的第三方日志记录框架,链接地址官方文档中有:
●elmah.io(GitHub 存储库)
●Gelf(GitHub 存储库)
●JSNLog(GitHub 存储库)
●KissLog.net(GitHub 存储库)
●Loggr(GitHub 存储库)
●NLog(GitHub 存储库)
●Sentry(GitHub 存储库)
●Serilog(GitHub 存储库)
●Stackdriver(Github 存储库)
例如使用NLog:NLog是一个灵活的免费日志记录平台,适用于各种.NET平台,包括.NET标准。NLog可以轻松写入多个目标。(数据库,文件,控制台)并即时更改日志记录配置。

8.总结

这篇主要讲了asp.net core内置的日志提供程序,内置的日志自带功能还是有限,比如不能写入到.txt文件或数据库中。在项目使用中还是要考虑使用第三方日志提供程序。本篇对于内置的日志提供程序还有:日志消息模板、日志作用域、Azure中的日志记录、日志事件ID等未介绍,具体再参考官方文档。

参考文献:
ASP.NET Core 中的日志记录

(14)ASP.NET Core 中的日志记录的更多相关文章

  1. ASP.NET Core 中的日志记录

    目录 内置日志的使用 使用Nlog 集成ELK 参考 内置日志的使用 Logger 是 asp .net core 的内置 service,所以我们就不需要在ConfigureService里面注册了 ...

  2. ASP.NET Core 异常处理与日志记录

    1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...

  3. 玩转ASP.NET Core中的日志组件

    简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...

  4. asp.net core 系列 13 日志

    一.概述 ASP.NET Core 支持适用于各种内置和第三方日志记录, 供程序的日志记录 API,本文介绍了如何将日志记录 API 与内置提供程序一起使用.对于第三方日志记录提供程序使用,文章最后有 ...

  5. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  6. Asp.Net Core中利用Seq组件展示结构化日志功能

    在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...

  7. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  8. 谈谈ASP.NET Core中的ResponseCaching

    前言 前面的博客谈的大多数都是针对数据的缓存,今天我们来换换口味.来谈谈在ASP.NET Core中的ResponseCaching,与ResponseCaching关联密切的也就是常说的HTTP缓存 ...

  9. 在 .NET Core 中使用 DiagnosticSource 记录跟踪信息

    前言 最新一直在忙着项目上的事情,很久没有写博客了,在这里对关注我的粉丝们说声抱歉,后面我可能更多的分享我们在微服务落地的过程中的一些经验.那么今天给大家讲一下在 .NET Core 2 中引入的全新 ...

随机推荐

  1. 如何确保TCP协议传输稳定可靠?

    TCP,控制传输协议,它充分实现了数据传输时的各种控制功能:针对发送端发出的数据包确认应答信号ACK:针对数据包丢失或者出现定时器超时的重发机制:针对数据包到达接收端主机顺序乱掉的顺序控制:针对高效传 ...

  2. Junit4学习使用和总结

    Junit4学习使用和总结 部分资料来源于网络 编辑于:20190710 一.Junit注解理解 1.@RunWith 首先要分清几个概念:测试方法.测试类.测试集.测试运行器.其中测试方法就是用@T ...

  3. Python爬虫入门:爬取豆瓣电影TOP250

    一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...

  4. Drools规则引擎-判断集合(List)是否包含集合

    问题场景 在使用Drools规则引擎时,有朋友会遇到这样的问题,就是在when部分判断的两个参数都是集合类型,比如两个List,此时要判断一个集合是否包含另外一个集合的内容. 拿一个具体的例子来说明, ...

  5. 解决webpack打包速度慢的解决办法

    技巧1 webpack在打包的时候第一次总是会做很长的准备工作,包括加载插件之类的.在刚接触webpack的时候总是webpack一下-测一下-改一下-再webpack一下,这种方式最后让很多人崩溃了 ...

  6. 多线程总结-同步之synchronized关键字

    目录 1.为什么要使用synchronized? 2.synchronized锁什么,加锁的目的是什么? 3.代码示例 3.1锁this和临界资源对象 3.2锁class类对象 3.3 什么时候锁临界 ...

  7. flash put_movie loadmovie 区别

    put_Movie 应该是c++的函数用来往程序加载一个swf用的,as3里没有loadmovie是flash用的,用来加载另一个swf或jpeg文件 不过这个loadmovie这个函数是在as2中用 ...

  8. 在dotnet core实现类似crontab的定时任务

    前段需要在业务中实现某些时间段的简单定时任务,类似crontab的调度,因为业务会放在docker中,所以不想用直接用crontab,在网上搜了一下,发现一个开源的实现 Pomelo.AspNetCo ...

  9. VUE v-for循环中每个item节点动态绑定不同函数方法

    一. 业务场景: 一个title 处 可能有 一个或多个按钮,  按钮对应不同的响应事件 二. 思路 : 按钮个数 根据传入的数据length 来循环渲染,  每条数据对应的事件名称 通过动态绑定 三 ...

  10. jmeter使用问题——将接口返回变量存储成csv文件

    在使用jmeter做接口测试时,一整个jmx测试计划中,存在多个线程,多个接口的测试 但是接口可以分类,比如业务接口.查询接口.更新接口等 考虑自动化接口测试一般都是一次性的,有完整的闭环链路,一般步 ...