(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 中引入的全新 ...
随机推荐
- Input标签中Type的类型及详细用法
Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍.1,type=text输入类型是text,这是我们见的最多 ...
- HDU 5534:Partial Tree(完全背包)***
题目链接 题意 给出一个n个结点的树,给出n-1个度的权值f[],代表如果一个点的度数为i,那么它对于答案的贡献有f[i].问在这棵树最大的贡献能达到多少. 思路 对于这个图,有n*2-2个度可以分配 ...
- easyui close的最大化的dialog 切换 tab 再次出现
今天发现一个神奇的bug,easyui中的dialog在经历了d.panel('close');之后,当前的tab仍然未关闭,切换了另一tab,然后回去刚才的tab,发现已经close的dialog又 ...
- python 微信红包生成器
#红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...
- JAVA基础之JDK安装
JDK的安装与环境变量配置是JAVA开发之路的第一步,很多新人在这一步上就卡了很久,浪费了很多时间,甚至有些人就轻易地“从入门到放弃”了. 今天我们就来一步步教你如何打倒这第一只拦路虎. 1.JDK下 ...
- Bzoj 3124: [Sdoi2013]直径 题解
3124: [Sdoi2013]直径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1222 Solved: 580[Submit][Status] ...
- 在rman恢复中incarnation的概念
摘要 本文主要介绍incarnation的由来,在rman恢复中的作用,以及相关rman恢复的注意事项. 概念说明 从10g开始,incarnation被引入,用于跨越resetlogs进行恢复,由此 ...
- Python3安装与使用urllib2包之小坑
Python3 安装urllib2包之小坑 Python3.6.6或者说python3.x找不到urllib2语法问题修改之后,会报一个没有安装urllib2的包的错误. 通过pip install ...
- nginx目录穿越漏洞复现
nginx目录穿越漏洞复现 一.漏洞描述 Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞. 二.漏洞原理 1. 修改nginx.conf,在如下图位置添加如下配置 在如 ...
- HttpWebRequest的使用之Get和Post的差别(C#)
这两天做的是通过一个HttpWebRequest将采集地址发送到服务端,服务端会返回一个JSON格式的字符串,然后我这边再对这个JSON进行反序列化,得到我想要的数据.在这篇文章里我简单介绍一下Htt ...