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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ASP.NET Core ---日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制作uefi的kali安装盘_制作 UD
- 下一篇: python写完程序怎么运行