ASP.NET Core ---日志

一、日志记录:

     1、日志的作用:

           程序中记录日志一般有两个目的,故障定位和显示程序运行状态。好的日志记录方式可以提供足够多定位问题的依据。

 

      2、日志的等级:

           

            有良好工作习惯的人,工作的时候会将领导交待下来的工作分为:紧急重要、重要不紧急、紧急不重要、不紧急不重要等;同样 ASP.NET Core 定义了以下日志级别(按严重性从低到高排列)。

            每次写入日志时都需指定其 LogLevel。 日志级别指示严重性或重要程度。 例如,如果方法正常结束则写入 Information 日志,如果方法返回 404 返回代码则写入 Warning 日志,如果捕获未知异常则写入 Error 日志。 可以使用日志级别控制写入到特定存储介质或显示窗口的日志输出量。 例如在生产中,可将所有 Information 及以下级别的日志放在卷数据存储,将所有 Warning 及以上级别的日志放在值数据存储。 在开发期间,通常要将严重性为 Warning 或以上级别的日志发送到控制台。 需要进行故障排除时,可添加 Debug 级别。

  • Trace = 0

           表示仅对于开发人员调试问题有价值的信息。 这些消息可能包含敏感应用程序数据,因此不得在生产环境中启用它们。 默认情况下禁用。 示例:Credentials: {"User":"someuser", "Password":"P@ssword"}

  • Debug = 1

           表示在开发和调试过程中短期有用的信息。 示例:Entering method Configure with flag set to true.。除非要排查问题,否则通常不会在生产中启用 Debug 级别日志,因为日志数量过多。

  • Information = 2

           用于跟踪应用程序的常规流。 这些日志通常有长期价值。 示例:Request received for path /api/todo

  • Warning = 3

           表示应用程序流中的异常或意外事件。 可能包括不会中断应用程序运行但仍需调查的错误或其他条件。 Warning 日志级别常用于已处理的异常。 示例:FileNotFoundException for file quotes.txt.

  • Error = 4

           表示无法处理的错误和异常。 这些消息指示的是当前活动或操作(如当前 HTTP 请求)中的失败,而不是应用程序范围的失败。日志消息示例:Cannot insert record due to duplicate key violation.

  • Critical = 5

           需要立即关注的失败。 例如数据丢失、磁盘空间不足。

二、使用内置的Logger

微软官方文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1

因为Logger是asp.net core 的内置service,所以我们就不需要在ConfigureService里面注册了。如果是asp.net core 1.0版本的话,我们需要配置一个或者多个Logger,但是asp.net core 2.0的话就不需要做这个工作了,因为在CreateDefaultBuilder方法里默认给配置了输出到Console和Debug窗口的Logger。这是源码:

 public static IWebHostBuilder CreateDefaultBuilder(string[] args){var builder = 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);if (env.IsDevelopment()){var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly != null){config.AddUserSecrets(appAssembly, optional: true);}}config.AddEnvironmentVariables();if (args != null){config.AddCommandLine(args);}}).ConfigureLogging((hostingContext, logging) =>{logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));logging.AddConsole();logging.AddDebug();}).UseIISIntegration().UseDefaultServiceProvider((context, options) =>{options.ValidateScopes = context.HostingEnvironment.IsDevelopment();});if (args != null){builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());}return builder;}
View Code

注入Logger

 

 

我们可以在ProductController里面注入ILoggerFactory然后再创建具体的Logger。但是还有更好的方式,Container可以直接提供一个ILogger<T>的实例,这时候呢Logger就会使用T的名字作为日志的类别:

namespace CoreBackend.Api.Controllers
{[Route("api/[controller]")]public class ProductController : Controller{private ILogger<ProductController> _logger;public ProductController(ILogger<ProductController> logger){_logger = logger;}
......

如果通过Constructor注入的方式不可用,那么我们也可以直接从Container请求来得到它:HttpContext.RequestServices.GetService(typeof(ILogger<ProductController>)); 如果你在Constructor写这句话可能会空指针,因为这个时候HttpContext应该是null吧。

不过还是建议使用Constructor注入的方式!!!

然后我们记录一些日志吧:

        [Route("{id}", Name = "GetProduct")]public IActionResult GetProduct(int id){var product = ProductService.Current.Products.SingleOrDefault(x => x.Id == id);if (product == null){_logger.LogInformation($"Id为{id}的产品没有被找到..");return NotFound();}return Ok(product);}

Log记录时一般都分几个等级,这点我假设大家都知道吧,就不介绍了。

然后试一下:通过Postman访问一个不存在的产品:‘/api/product/22’,然后看看Debug输出窗口:

嗯,出现了,前边是分类,也就是ILogger<T>里面T的名字,然后是级别 Information,然后就是我们记录的Log内容。

再Log一个Exception:

[Route("{id}", Name = "GetProduct")]
public IActionResult GetProduct(int id)
{try{throw new Exception("来个异常!!!");var product = ProductService.Current.Products.SingleOrDefault(x => x.Id == id);if (product == null){_logger.LogInformation($"Id为{id}的产品没有被找到..");return NotFound();}return Ok(product);}catch (Exception ex){_logger.LogCritical($"查找Id为{id}的产品时出现了错误!!", ex);return StatusCode(500, "处理请求的时候发生了错误!");}
}

记录Exception就建议使用LogCritical了,这里需要注意的是Exception的发生就表示服务器发生了错误,我们应该处理这个exception并返回500。使用StatusCode这个方法返回特定的StatusCode,然后可以加一个参数来解释这个错误(这里一般不建议返回exception的细节)。

运行试试:

OK。

Log到Debug窗口或者Console窗口还是比较方便的,但是正式生产环境中这肯定不够用。

正式环境应该Log到文件或者数据库。虽然asp.net core 的log内置了记录到Windows Event的方法,但是由于Windows Event是windows系统独有的,所以这个方法无法跨平台,也就不建议使用了。

官方文档上列出了这几个建议使用的第三发Log Provider:

把这几个Log provider注册到asp.net core的方式几乎是一摸一样的,所以介绍一个就行。我们就用比较火的NLog吧。

 

 

三、NLog

官方文档:https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

首先通过nuget安装Nlog: 

注意要勾上include prerelease,目前还不是正式版。

装完之后,我们就需要为Nlog添加配置文件了。默认情况下Nlog会在根目录寻找一个叫做nlog.config的文件作为配置文件。那么我们就手动改添加一个nlog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><targets><target name="logfile" xsi:type="File" fileName="logs/${shortdate}.log" /></targets><rules><logger name="*" minlevel="Info" writeTo="logfile" /></rules>
</nlog>

然后设置该文件的属性如下:

对于Nlog的配置就不进行深入介绍了。具体请看官方文档的.net core那部分。

然后需要把Nlog集成到asp.net core,也就是把Nlog注册到ILoggerFactory里面。所以打开Startup.cs,首先注入ILoggerFactory,然后对ILoggerFactory进行配置,为其注册NLog的Provider:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){// loggerFactory.AddProvider(new NLogLoggerProvider());
            loggerFactory.AddNLog();if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler();}app.UseStatusCodePages();app.UseMvc();}

针对LoggerFactory.AddProvider()这种写法,Nlog一个简单的ExtensionMethod做了这个工作,就是AddNlog();

添加完NLog,其余的代码都不需要改,然后我们试下:

在如图所示的位置出现了log文件。内容如下:

 

四、Serilog

           官方文档:    Asp.net core  https://github.com/serilog/serilog-aspnetcore         

                             Sinks-file: https://github.com/serilog/serilog-sinks-file       

                             Sinks-Console:https://github.com/serilog/serilog-sinks-console

          (1) 添加:Serilog

                       

 

 

 

 

 参考资料:

           https://www.cnblogs.com/cgzl/p/7652413.html;

           https://v.qq.com/x/page/m0762gzo2l6.html

           https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1

         

 

转载于:https://www.cnblogs.com/fuyouchen/p/9584084.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021年慈溪横河中学高考成绩查询,慈溪中学

2013浙江慈溪中考分数线公布2013年慈溪市中考成绩揭晓&#xff0c;从慈溪市教育局获悉&#xff0c;今年慈溪市普高投档控制线为485.5;慈溪中学统招线为565。昨天&#xff0c;公办普高第一批次录取分数线同时划定&#xff1a;浒山中学541.5&#xff0c;龙山中学485.5&#xff0c…

circle函数用法 turtle_Python绘图库Turtle详细分析

关注Python学习交流学习更多Python知识Turtle库是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始&#xff0c;它根据一组函数指令的控制&#xff0c;在这个平面坐标系中移动&am…

全国计算机等级考试题库二级C操作题100套(第95套)

第95套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:计算NN矩阵的主对角线元素和反向对角线元素之和&#xff0c;并作为函数值返回。注意&#xff1a;要求先累加主对角线元素中的值&#xff0c;然后累加反向对角线元素中的值。例如&#xff0c;若N3&#xff0c;有下列…

性能测试基本流程介绍(《软件性能测试过程详解与安全剖析》)

1、性能测试团队的人员构成 性能测试团队中应包括以下角色&#xff1a;项目测试经理、测试设计角色、测试开发角色、测试执行角色、测试分析角色和支持角色&#xff08;如系统、网络和数据库支持等&#xff09;。 2、性能测试过程模型(PTGM) PTGM模型包括以下几个步骤&#xff…

苹果6s html5分数,iPhone 6s Plus的屏幕尺寸是多少?分辨率是多少?

iPhone 6s Plus的屏幕尺寸是多少iPhone 6s Plus的屏幕尺寸是5.5英寸。针对iPhone 6s Plus的屏幕尺寸是多少的问题&#xff0c;摄像头方面&#xff0c;苹果iPhone6s Plus采用了一枚1200万像素的iSight摄像头&#xff0c;其传感器单个像素尺寸的感光面积为1.22微米&#xff0c;这…

全国计算机等级考试题库二级C操作题100套(第96套)

第96套&#xff1a; 给定程序中,函数fun的功能是:有NN矩阵,将矩阵的外围元素顺时针旋转。 操作顺序是&#xff1a;首先将第一行元素的值存入临时数组r&#xff0c;然后使第一列成为第一行&#xff0c; 最后一行成为第一列,最后一列成为最后一行,临时数组中的元素成为最后一列。…

USB主机是如何检测到设备的插入的呢?

USB设备的插入检测机制 首先&#xff0c;在USB集线器的每个下游端口的D和D-上&#xff0c;分别接了一个15K欧姆的下拉电阻到地。这样&#xff0c;在集线器的端口悬空时&#xff0c;就被这两个下拉电阻拉到了低电平。而在USB设备端&#xff0c;在D或者D-上接了1.5K欧姆上拉电阻.…

python堆排序算法_python 排序 堆排序

算法思想 &#xff1a;堆排序利用堆数据结构设计的一种排序算法&#xff0c;堆是一种近似完全二叉树的结构&#xff0c;同时满足堆积的性质&#xff0c;即对于任意的i均有ki>k(2i1),ki>k(2i2)步骤&#xff1a;将数组转化为最大堆将当前堆的根结点和最后一个结点交换&…

final在类和方法中的使用

package final0; //final修饰的类不能继承//final修饰的方法不能继承public class TestFinal3 { public static void main(String[] args) { }} // 修饰的类不能继承final class Dad {}class Dad { // final修饰的方法不能继承:public final void method(){} public final void…

单招计算机专业考多少分可以录取,单招考多少分能过?单招分数线

单独招生是高等职业院校的一种招生形式&#xff0c;和普通高考相比&#xff0c;虽然单招人数连年增加&#xff0c;但报考人数相比高考总人数还是略少的&#xff0c;竞争压力没有那么大&#xff0c;录取率相对高很多&#xff0c;基本不存在落榜&#xff0c;上大学更安全&#xf…

全国计算机等级考试题库二级C操作题100套(第97套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

【job】2013年5-5阿里巴巴暑期实习招聘笔试题目及部分答案

网上各种标为2013年&#xff0c;实际上都是2012年或者更早的&#xff0c;下面的才是真正的2013年5月5日考试的卷子。 答题说明&#xff1a; 1.答题时间90分钟&#xff0c;请注意把握时间&#xff1b; 2.试题分为四个部分&#xff1a;单项选择题&#xff08;10题&#xff0c;20分…

powershell新建python文件_powershell如何打开Python

展开全部(1)打开powershell。在开始菜单的搜索框输入powershell&#xff0c;回车即可打开。(2)运行62616964757a686964616fe59b9ee7ad9431333337616631python。在打开的powershell里直接输入python&#xff0c;回车即可打开。如果python不能被识别&#xff0c;需要先在powershe…

操作系统以什么方式组织用户使用计算机,操作系统习题

1.1 什么是计算机的操作系统?操作系统是有效地控制和管理计算机系统资源&#xff0c;合理地组织计算机的工作流程&#xff0c; 以及方便用户的程序的集合1.2 操作系统管理计算机系统的哪些资源?操作系统管理和控制计算机系统中的所有软、硬件资源1.3 为什么要引进分时系统?分…

微信小程序的页面渲染(if/for)

下面&#xff0c;粗略的介绍一下微信小程序的条件渲染、列表渲染、数据绑定等&#xff0c;详细的内容大家可以去看微信小程序的API,在此只做简单描述&#xff0c;希望能帮助到大家 条件渲染 <!--wxml--> <view wx:if"{{view WEBVIEW}}"> WEBVIEW </v…

Linux进程间通信(管道、消息队列、共享内存、信号、信号量)

目录Linux进程间通信概述1.管道无名管道(pipe)有名管道(fifo)2.消息队列(msg)消息队列的通信原理消息队列相关api消息队列收发数据键值生成消息队列移除3.共享内存(shm)4.信号(sig)信号概述信号编程&#xff08;入门&#xff09;信号携带消息&#xff08;高级&#xff09;5.信号…

Eclipse上GIT插件EGIT使用手册之五_查看历史记录

Team -> Show in history可以查看版本历史提交记录 可以选择对比模式

emacs python debug_我常用的 Python 调试工具 - 博客 - 伯乐在线

以下是我做调试或分析时用过的工具的一个概览。如果你知道有更好的工具&#xff0c;请在评论中留言&#xff0c;可以不用很完整的介绍。日志没错&#xff0c;就是日志。再多强调在你的应用里保留足量的日志的重要性也不为过。你应当对重要的内容打日志。如果你的日志打的足够好…

solr7.4 centos7安装

环境&#xff1a;centos7、JDK1.8、solr 自带Jetty启动 一、安装JDK1.8环境 1、下载JDK jdk-8u172-linux-x64.rpm 下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2、安装JDK rpm -ivh jdk-8u131-linux-x64.rpm 3、…

一个常见的台式计算机有哪些硬件部分组成,台式电脑有哪些组成部分

篇一&#xff1a;电脑硬件的基本组成部分电脑硬件的基本组成部分 很多刚接触电脑的朋友不是很清楚电脑组成部分&#xff0c;不清楚电脑硬件由什么组成&#xff0c;电脑学习网就为朋友们详细介绍电脑硬件的组成&#xff0c;并简单介绍电脑组成部分的这些电脑硬件的基本功能。(1)…