(14)ASP.NET Core 中的日志记录
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 中的日志记录的更多相关文章
- ASP.NET Core 中的日志记录
目录 内置日志的使用 使用Nlog 集成ELK 参考 内置日志的使用 Logger 是 asp .net core 的内置 service,所以我们就不需要在ConfigureService里面注册了 ...
- ASP.NET Core 异常处理与日志记录
1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
- asp.net core 系列 13 日志
一.概述 ASP.NET Core 支持适用于各种内置和第三方日志记录, 供程序的日志记录 API,本文介绍了如何将日志记录 API 与内置提供程序一起使用.对于第三方日志记录提供程序使用,文章最后有 ...
- asp.net core 集成 log4net 日志框架
asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- ASP.NET Core 1.0 开发记录
官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...
- 谈谈ASP.NET Core中的ResponseCaching
前言 前面的博客谈的大多数都是针对数据的缓存,今天我们来换换口味.来谈谈在ASP.NET Core中的ResponseCaching,与ResponseCaching关联密切的也就是常说的HTTP缓存 ...
- 在 .NET Core 中使用 DiagnosticSource 记录跟踪信息
前言 最新一直在忙着项目上的事情,很久没有写博客了,在这里对关注我的粉丝们说声抱歉,后面我可能更多的分享我们在微服务落地的过程中的一些经验.那么今天给大家讲一下在 .NET Core 2 中引入的全新 ...
随机推荐
- [apue] 使用 poll 检测管道断开
一般使用 poll 检测 socket 或标准输入时,只要指定 POLLIN 标志位,就可以检测是否有数据到达,或者连接断开: ]; fds[].fd = STDIN_FILENO; fds[].ev ...
- [Vue 牛刀小试]:第十五章 - 传统开发模式下的 axios 使用入门
一.前言 在没有接触 React.Angular.Vue 这类 MVVM 的前端框架之前,无法抛弃 Jquery 的重要理由,除了优秀的前端 DOM 元素操作性以外,能够非常便捷的发起 http 请求 ...
- 并发编程-concurrent指南-原子操作类-AtomicBoolean
类AtomicBoolean
- 记一次linux服务器入侵应急响应
近日接到客户求助,他们收到托管电信机房的信息,通知检测到他们的一台服务器有对外发送攻击流量的行为.希望我们能协助排查问题. 一.确认安全事件 情况紧急,首先要确认安全事件的真实性.经过和服务器运维人员 ...
- Centos7 安装jdk,MySQL
报名立减200元.暑假直降6888. 邀请链接:http://www.jnshu.com/login/1/20535344 邀请码:20535344 学习阿里云平台的云服务器配置Java开发环境.我现 ...
- 用Python玩数据-笔记整理-第一章
第一个程序:print >>>print("Hallo World!") >>>Hallo World! mystring = "Ha ...
- 使用反射机制将对象序列化Json
一 思路 获取对象的Class对象. 获取对象的属性数组, 迭代属性数据拼接属性名与属性值, 存入List. 将List转换为流库, 再将流库使用逗号分隔符转换为字符串, 去掉首尾的逗号 二 代码 p ...
- C++内存泄漏及检测工具详解
#include "stdafx.h" #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, ...
- JavaScript ES6 Promiss对象
说明 Node.js中,以异步(Async)回调著称,使用了异步,提高了程序的执行效率,但是,代码可读性较差的. 假如有几个异步操作,后一个操作需要前一个操作的执行完毕之后返回的数据才能执行下去,如果 ...
- .net持续集成sonarqube篇之项目管理与用户管理
系列目录 删除项目 在学习阶段,我们可能需要经常删除已构建的项目,在sonarqube中想要删除一个项目有两个入口,都在Administration导航栏内. 在项目内部的管理界面删除 如果项目处于打 ...