NetCore3.1 日誌元件 Nlog的使用
阿新 • • 發佈:2020-07-29
十年河東,十年河西,莫欺少年窮
學無止境,精益求精
本篇部落格系轉載至:https://blog.csdn.net/fqydhk/article/details/104724445
1.新增Nuget程式包
NLog
和
NLog.Web.AspNetCore
2.建立名稱為: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"autoReload="true" internalLogLevel="Info"> <!-- 啟用.net core的核心佈局渲染器 --> <extensions> <add assembly="NLog.Web.AspNetCore" /> </extensions> <!-- 寫入日誌的目標配置 --> <targets> <!-- 除錯 --> <target xsi:type="File" name="debug"fileName="logs/debug-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> <!-- 警告 --> <target xsi:type="File" name="warn"fileName="logs/warn-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> <!-- 錯誤 --> <target xsi:type="File" name="error" fileName="logs/error-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> </targets> <!-- 對映規則 --> <rules> <!-- 除錯 --> <logger name="*" minlevel="Trace" maxlevel="Debug" writeTo="debug" /> <!--跳過不重要的微軟日誌--> <logger name="Microsoft.*" maxlevel="Info" final="true" /> <!-- 警告 --> <logger name="*" minlevel="Info" maxlevel="Warn" writeTo="warn" /> <!-- 錯誤 --> <logger name="*" minlevel="Error" maxlevel="Fatal" writeTo="error" /> </rules> </nlog>
3.Program.cs 新增Nlog
public class Program { public static void Main(string[] args) { //這裡新增Nlog var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger(); try { //測試Nlog日誌輸出 logger.Debug("init main"); CreateHostBuilder(args).Build().Run(); } catch (Exception exception) { logger.Error(exception, "Stopped program because of exception"); throw; } finally { NLog.LogManager.Shutdown(); } } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }).UseNLog();//新增你的日誌元件 }
4.通過構造方法注入實現寫日誌功能
using FranchiseeInterface.Franchisee; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FranchiseeApi.Helper.Middlewares { public class ExceptionMiddlewares { private readonly RequestDelegate next; private IHostingEnvironment environment; //Nlog構造方法注入 private readonly ILogger<ExceptionMiddlewares> _logger; public ExceptionMiddlewares(RequestDelegate next, IHostingEnvironment environment, ILogger<ExceptionMiddlewares> logger) { _logger = logger; this.next = next; this.environment = environment; } public async Task Invoke(HttpContext context) { try { await next.Invoke(context); var features = context.Features; } catch (Exception e) { await HandleException(context, e); } } private async Task HandleException(HttpContext context, Exception e) { context.Response.StatusCode = 500; context.Response.ContentType = "text/json;charset=utf-8;"; string error = ""; if (environment.IsDevelopment()) { var json = new { message = e.Message }; //// log.Error(json); //_logger.LogDebug("這裡是homeController構造方法"); //_logger.Log(LogLevel.Information,"測試"); _logger.LogError(JsonConvert.SerializeObject(json)); error = JsonConvert.SerializeObject(json); } else error = "抱歉,出錯了"; await context.Response.WriteAsync(error); } } }
至此,就結束了。