异常是在编程时,一个意外的事件,如无效的输入或链接丢失,当程序执行破坏的指令流时就会出现这种状况。Exception是Exceptional event的简要表达。异常的实现须要保存抛出异常捕获点的必要信息,这会必定程度上致使程序变慢,这也是人们诟病异常性能的缘由。html
异常(Exception)是一种非程序缘由的操做失败,而错误(Error)则意味着程序有缺陷。
Exception是一种类.例外会中断执行堆栈直到被捕获.一个异常能够用来传达一个错误,可是更广泛的是用来表示出现了一些例外.数据库
想要在应用程序中显示详细的异常信息,展现错误详情的页面在Microsoft.AspNetCore.Diagnostics
包中,可是自从ASP.NET Core 2.0开始Microsoft.AspNetCore.All
包里面包含了全部以Microsoft.AspNetCore
开头的包,因此不须要在额外安装Microsoft.AspNetCore.Diagnostics
包,可是须要在Startup
类的Configure
方法中进行配置apache
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { env.EnvironmentName = EnvironmentName.Production; if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/error"); }
将UseDeveloperExceptionPage
放在你想捕获的中间件以前,如app.UseMvc
。编程
注:为了应用程序的安全,通常不会在生产环境中启起用开发者页面(异常页面)。json
示例安全
HomeController.cs 手动抛出一个异常app
public class HomeController : Controller { public IActionResult Index() { throw new Exception("dddd"); return View(); } }
运行结果框架
这样的错误提示是很难让开发人员定位出错的位置;若要展现开发者页面,还须要将应用程序环境设置为Development
。asp.net
开发者页面有几个标签页面包含了异常信息和请求参数的信息:性能
堆栈的详细、查询参数、Cookies信息和请求头这些打印出来方便开发人员快速定位错误。可是程序在开发的时候能够直接这样定位出错位置,可是在生产环境中就须要借助日志将出错信息写到日志文件里面以方便开发人员定位错误。
程序中记录日志通常有两个目的,故障定位和显示程序运行状态。好的日志记录方式能够提供足够多定位问题的依据。
若是有良好的习惯的人平时工做的时候会将领导交待下来的工做分为:紧急重要、重要不紧急、紧急不重要、不紧急不重要等;一样ASP.NET Core也将日志定义了多个等级,从0到5总共6个等级:
这个级别只对开发人员调试有价值。这些消息可能包含敏感的应用程序数据,所以不该该在生产环境中启用。
对于在开发和调试过程当中具备短时间可用性的信息。若是不是出现问题在生产环境通常不建议启用。
用于跟踪应用程序,这些日志有长期的价值。
用于程序中的异常或意外事件。这些可能包括错误或其余不致使应用程序中止的条件,可是可能须要进行排查。
对于不能处理的错误过异常。这些消息代表当前的活动或操做(例如当前的HTTP请求)失败,而不是应用程序范围的失败。
对于那些须要当即关注的失败。示例:磁盘空间中的数据丢失场景。
开发人员能够根据日志级别将众多日志存储到不到的介质中,以供分析用户需求、定准程序错误等。
ASP.NET Core支持可与各类日志记录提供程序配合使用的日志记录API。 内置提供程序容许您将日志发送到一个或多个目标,而且能够插入第三方日志记录框架。
用.NET Core内置日志接口将日志信息打印到控制台上
public class Startup { ... public virtual void Configure(IApplicationBuilder app) { ... app.UseExceptionHandler("/Home/Error"); ... } }
using Microsoft.AspNetCore.Diagnostics; using Microsoft.Extensions.Logging; public class HomeController : Controller { private readonly ILogger _logger; public HomeController (ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index () { throw new Exception ("dddd"); return View (); } public IActionResult Error() { var feature = HttpContext.Features.Get<IExceptionHandlerFeature>(); var error = feature?.Error; _logger.LogError("Oops!Error Info-----:", error); return View("~/Views/Shared/Error.cshtml", error); } }
Program.cs
public class Program { public static void Main (string[] args) { BuildWebHost (args).Run (); } public static IWebHost BuildWebHost (string[] args) => WebHost.CreateDefaultBuilder (args) .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) => { logging.AddConfiguration (hostingContext.Configuration.GetSection ("Logging")); logging.AddConsole (); logging.AddDebug (); }) .UseStartup<Startup> () .Build (); }
经过ASP.NET Core内置的日志支持能够很轻松将日志打印到控制台上面
注:
IExceptionHandlerFeature
接口位于Microsoft.AspNetCore.Diagnostics
包下,因此须要引入Microsoft.AspNetCore.Diagnostics
;ILogger
接口定义在Microsoft.Extensions.Logging.Abstractions
包,而且默认实如今Microsoft.Extensions.Logging
包里面。
可是,在生产环境中日志是记录在数据库或文件当中,下面以log4net做为例子将日志记录到文件当中。
log4net 保存日志
在选择log4net的时候最好选择最新版,log4net从2.0.6开始支持.NET Core。
执行dotnet restore
命令将nuget包拉到本地。肯定本地.nuget文件夹里面有log4net而且版本号也一致。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- This section contains the log4net configuration settings --> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" /> </appender> <appender name="FileAppender" type="log4net.Appender.FileAppender"> <param name="Encoding" value="utf-8" /> <file value="log-file.log" /> <appendToFile value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="Encoding" value="utf-8" /> <file value="logfile/" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <staticLogFileName value="false" /> <datePattern value="yyyyMMdd'.log'" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="1MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!-- Setup the root category, add the appenders and set the default level --> <root> <level value="ALL" /> <appender-ref ref="ConsoleAppender" /> <appender-ref ref="FileAppender" /> <appender-ref ref="RollingLogFileAppender" /> </root> </log4net> </configuration>
这里定义了三个appender,都会起做用;日志等级为ALL将会记录全部类型的日志。
Startup.cs
using System.IO; using log4net; using log4net.Config; using log4net.Repository; public class Startup { public static ILoggerRepository Repository; public Startup (IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); Repository = LogManager.CreateRepository ("NETCoreRepository"); XmlConfigurator.Configure (Repository, new FileInfo ("log4net.config")); }
HomeController.cs
public class HomeController : Controller { private ILog log = LogManager.GetLogger (Startup.Repository.Name, typeof (HomeController)); public IActionResult Index () { throw new Exception ("Manul Exception:"); return View (); } public IActionResult Error () { var feature = HttpContext.Features.Get<IExceptionHandlerFeature> (); var error = feature?.Error; log.Error(error); return View ("~/Views/Shared/Error.cshtml", error); } }
运行结果
访问首页时会出异常,根据跳转到错误路由Error
方法中;同时在项目中会生成两个文件:
FileAppender生成的log-file.log日志文件
RollingLogFileAppender 是按时间生成的日志文件
控件台打印出来的日志文件
RollingLogFileAppender 打印的日志文件
FileAppender打段日志文件
从上面来看三种Appender打印的三种日志是一致的,因此在实际开发的时候能够根据须要来用哪一种方式进行记录日志。
本节讲解了两个知识点:
参与资料:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?tabs=aspnetcore2x
http://logging.apache.org/log4net/release/manual/configuration.html
做者:xdpie 出处: http://www.cnblogs.com/vipyoumay/p/7838069.html