背景
.net core 中已經集成了log的方法, 但是只能控制台輸出不能寫入文件等等. 常見第三方的的日志工具包括log4net, nlog等等, 本文介紹nlog
一. 引用程序集, nuget 安裝NLog.Web.AspNetCore
二. 創建nlog.config配置文件, 可以直接復制下面的配置文件內容
具體的配置說明 可以參考 https://www.cjavapy.com/article/183/

<?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="Off" internalLogFile="c:\temp\internal-nlog.txt"> <!-- enable asp.net core layout renderers --> <extensions> <add assembly="NLog.Web.AspNetCore"/> </extensions> <!-- the targets to write to --> <targets> <!-- write logs to file --> <target xsi:type="File" name="allfile" fileName="${basedir}/logs/${logger}/${shortdate}.log" layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace} ${newline} ${exception:format=tostring} ${newline}" /> <!-- another file log, only own logs. Uses some ASP.NET core renderers --> <target xsi:type="Debugger" name="debugger" layout="${date:format=HH\:mm\:ss.fff}: ${message}" /> </targets> <!-- rules to map from logger name to target --> <rules> <!--Skip non-critical Microsoft logs and so log only own logs--> <logger name="Microsoft.*" maxlevel="Error" final="true" /> <logger name="*" minlevel="Debug" writeTo="debugger" /> <logger name="*" minlevel="Info" writeTo="allfile" /> </rules> </nlog>
三. Program.cs 注入, UseNLog()
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .UseNLog();// 添加這句 注入nlog
四. 控制器里使用
/// <summary> /// 日志 /// </summary> private readonly ILogger<DemoController> _logger; /// <summary> /// 構造函數 /// </summary> /// <param name="logger"></param> public DemoController(ILogger<DemoController> logger) { _logger = logger; } public IActionResult Test() { _logger.LogError("我是日志內容"); return Ok("ok"); }
結果
在輸出里面會有結果
也可以在日志文件里看見
五. 封裝
雖然.net core 推薦依賴注入, 但是這種使用方式還是會不方便, 所以我可以封裝成一個類, 需要的時候直接用. 代碼如下:

/// <summary> /// Nlog日志幫助類 /// Trace 包含大量的信息,例如 protocol payloads。一般僅在開發環境中啟用, 僅輸出不存文件。 /// Debug 比 Trance 級別稍微粗略,一般僅在開發環境中啟用, 僅輸出不存文件。 /// Info 一般在生產環境中啟用。 /// Warn 一般用於可恢復或臨時性錯誤的非關鍵問題。 /// Error 一般是異常信息。 /// Fatal - 非常嚴重的錯誤! /// </summary> public class NLogHelper { readonly Logger logger; private NLogHelper(Logger logger) { this.logger = logger; } /// <summary> /// 自定義 ${logger} (我用於區分文件夾) /// </summary> /// <param name="name"></param> public NLogHelper(string name) : this(NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetLogger(name)) { } /// <summary> /// 默認 ${logger} (Default 文件夾下) /// </summary> public static NLogHelper Default { get; private set; } static NLogHelper() { Default = new NLogHelper(NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetLogger("Default")); } public void Debug(string msg, params object[] args) { logger.Debug(msg, args); } public void Debug(string msg, Exception err) { logger.Debug(err, msg); } public void Info(string msg, params object[] args) { logger.Info(msg, args); } public void Info(string msg, Exception err) { logger.Info(err, msg); } public void Trace(string msg, params object[] args) { logger.Trace(msg, args); } public void Trace(string msg, Exception err) { logger.Trace(err, msg); } public void Error(string msg, params object[] args) { logger.Error(msg, args); } public void Error(string msg, Exception err) { logger.Error(err, msg); } public void Fatal(string msg, params object[] args) { logger.Fatal(msg, args); } public void Fatal(string msg, Exception err) { logger.Fatal(err, msg); } }
使用方式
public IActionResult Test() { NLogHelper.Default.Fatal("默認logger"); new NLogHelper("Diy").Error("自定義logger"); return Ok("ok"); }
參考文獻: https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3