NLog是適用於各類.NET平臺的靈活,免費的日誌記錄平臺。NLog使寫入多個目標變得容易 。(數據庫,文件,控制檯)並即時更改日誌記錄配置。(本文主要介紹寫日誌到文件中)
Nlog官網:https://nlog-project.org/
Nlog配置說明:https://nlog-project.org/config/
Nlog Github Wiki:https://github.com/NLog/NLog/wikigithub
注:如下操做爲 asp.net core web項目,編輯器爲VS2019web
PM> Install-Package NLog
dotnet add package NLog
在項目的根目錄下,在cmd窗口中輸入上面的命令便可安裝。
shell
下面的配置,就是一個簡單的配置Nlog.config的demo,將下面的配置複製到Nlog.config中,便可將日誌寫入到PsTest.log文件中。數據庫
<?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="file" xsi:type="File" fileName="${basedir}\PsTest.log" layout="${longdate} | ${level:uppercase=true}: ${message} | ${stacktrace}" maxArchiveFiles="3" archiveAboveSize="10240" encoding="utf-8"/> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="file"></logger> </rules> </nlog>
下面簡單介紹下各配置項的意思:
targets 節點中定義了一系列日誌輸出目標,每個輸出目標是一個 target 元素。
target標籤:bash
rules 節點是日誌路由規則的集合,由一個或多個 logger 元素組成。每一個 logger 元素記錄了 logger 的名字、目標輸出以及要處理的日誌等級。
logger標籤:asp.net
public static void Main(string[] args) { var i = 100; while (i > 1) { NlogTest(); i--; } } public static void NlogTest() { //經過NLog.LogManager.GetCurrentClassLogger方法能夠建立一個與所在類同名(包括 namespace)的 NLog.Logger 的實例。 var logger = LogManager.GetCurrentClassLogger(); logger.Error("something Error!"); logger.Info("something Info!"); logger.Debug("something Debug!"); try { List<int> ls = null; var c = ls.Count; } catch (Exception ex) { logger.Error(ex.Message); } }
來到應用的生成目錄下面便可看到PsTest.log日誌文件。
能夠看到生成了多個log文件,由於配置文件設置的log文件最大爲10k。
打開PsTest.0.log文件:
日誌已經按照配置的格式寫入到文件中!編輯器
但這樣寫有個問題,就是每次寫日誌都要先建立一個NLog.Logger 的實例,這樣的話,若是程序集較多,就形成了代碼冗餘,因此,仍是封裝一個Nlog的幫助類比較好,每次都調用這個類去寫日誌spa
public class PsLog { public static void Error(Exception ex) { Exception iex = GetInnerException(ex); Error(iex.ToString()); } public static void Error(string msg) { WriteLog(msg, LogLevel.Error); } private static void WriteLog(string msg, LogLevel level) { try { if (LogLevel.Debug == level) { LogManager.GetCurrentClassLogger().Debug(msg); } else if (LogLevel.Error == level) { LogManager.GetCurrentClassLogger().Error(msg); } else if (LogLevel.Fatal == level) { LogManager.GetCurrentClassLogger().Fatal(msg); } else if (LogLevel.Info == level) { LogManager.GetCurrentClassLogger().Info(msg); } else if (LogLevel.Trace == level) { LogManager.GetCurrentClassLogger().Trace(msg); } else if (LogLevel.Warn == level) { LogManager.GetCurrentClassLogger().Warn(msg); } else { LogManager.GetCurrentClassLogger().Info(msg); } } catch (System.Exception e) { try { string strPath = Directory.GetCurrentDirectory(); using (FileStream fs = File.Open(strPath + @"\fatal.txt", FileMode.OpenOrCreate)) using (StreamWriter sw = new StreamWriter(fs)) sw.WriteLine(DateTime.Now.ToString() + ": Can not write the nlog, " + e.Message); } catch(Exception ex) { Console.WriteLine(ex.ToString()); } } } public static void Info(string msg) { WriteLog(msg, LogLevel.Info); } private static Exception GetInnerException(Exception ex) { if (ex.InnerException == null) { return ex; } return GetInnerException(ex.InnerException); } }
public static void NlogTest() { PsLog.Error("something Error!"); PsLog.Info("something Info!"); PsLog.Debug("something Debug!"); try { List<int> ls = null; var c = ls.Count; } catch (Exception ex) { PsLog.Error(ex); } }