C# 使用 log4net 日誌元件的方法
阿新 • • 發佈:2021-01-04
一、 什麼是 log4net
Apache log4net 庫是幫助程式設計師將日誌語句輸出到各種輸出目標的工具,它是從Java中的Log4j遷移過來的一個.Net版的開源日誌框架。log4net 的一個顯著特徵是分層記錄器的概念,使用這些記錄器可以有選擇地控制任意粒度輸出日誌語句。主要特徵如下:
- 支援多個框架
- 輸出到多個日誌記錄目標
- 分層日誌記錄體系結構
- XML 配置
- 動態配置
- 日誌記錄上下文
- 久經考驗的架構
- 模組化和可擴充套件設計
- 高效能和靈活性
二、C# 使用 log4net
新增Nuget 包,搜尋到“log4net”後 ,選擇安裝,具體如下圖所示:
三、新增 log4net 配置檔案
使用 log4net需要我們配置log4net的配置檔案,目前,配置檔案是用 XML 編寫的。一般有兩種方式,一種是使用og4net自動生成的 “log4net.xml”進行配置,另一種是直接嵌入到執行程式的 app.config 檔案中。
具體內容如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <log4net> <!-- OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL --> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="ALL" /> <appender-ref ref="SysAppender" /> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="WebLogger"> <level value="DEBUG" /> </logger> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="log/" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="'demo_'yyyy_MM_dd-HH'.log'" /> <param name="StaticLogFileName" value="false" /> <param name="RollingStyle" value="Composite" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%date [th=%3thread] [line:%5L] [%-5level] %message%newline"/> </layout> </appender> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net> </configuration>
主要引數含義如下:
三、原始碼測試
我們可以新增一個日誌類,專門用於輸出日誌列印,具體程式碼如下(注意:log4net目前暫時不支援通過配置檔案進行檔案刪除,可通過配置檔案設定檔案個數與大小進行覆蓋備份檔案。因此,自動刪除日誌需要程式碼實現):
public static class LogUtil { private static log4net.ILog Log { get; } = log4net.LogManager.GetLogger("log"); /// <summary> /// 日誌載入設定 /// </summary> /// <param name="exeConfigFile">日誌配置檔名稱</param> /// <param name="day">保留天數,-1表示不刪除</param> public static void Configure(string exeConfigFile,int day=-1) { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(exeConfigFile)); if (day == -1) return; var files = new System.IO.DirectoryInfo("log").GetFiles(); foreach (var file in files) { // 定時刪除日誌檔案 if ((DateTime.Now - file.CreationTime).TotalDays > day) { file.Delete(); } } } private static string GetMethodName(int skipFrames = 2) { try { // 這裡忽略skipFrames層堆疊,也就忽略了當前方法GetMethodName,以及呼叫此方法的方法,這樣拿到的就正好是外部呼叫列印日誌所在函式的方法資訊 var method = new StackFrame(skipFrames).GetMethod(); var properties = method?.DeclaringType?.GetProperties( BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); var property = properties?.Where(p => p.GetGetMethod(true) == method || p.GetSetMethod(true) == method) .FirstOrDefault(); var name = $"{method?.DeclaringType?.ToString().Split('.').Last()}.{method?.Name}"; return property == null ? $"{name,-50}" : $"{property.Name,-50}"; } catch (Exception e) { return "ERROR TO GET CALLING METHOD"; } } private static string NoWarp(string msg) { return msg?.Replace("\r\n"," ").Replace("\n"," "); } private static string WrapException(string msg,Exception e) { var builder = new StringBuilder(msg); builder.Append("\t[").Append(e.Message).Append("]"); if (e.InnerException != null) { builder.Append(" --> [").Append(e.InnerException.Message).Append("]"); } return builder.ToString(); } public static void Debug(string msg) { Log.Debug(msg); } public static void Debug(string msg,Exception e) { Log.Debug(WrapException(msg,e),e); } public static void Info(string msg) { Log.Info(msg); } public static void Info(string msg,Exception e) { Log.Info(WrapException(msg,e); } public static void Warn(string msg) { Log.Warn(msg); } public static void Warn(string msg,Exception e) { Log.Warn(WrapException(msg,e); } public static void Error(string msg) { Log.Error(msg); } public static void Error(string msg,Exception e) { Log.Error(WrapException(msg,e); } public static void Fatal(string msg) { Log.Fatal(msg); } public static void Fatal(string msg,Exception e) { Log.Fatal(WrapException(msg,e); } }
測試程式碼如下:
static void Main(string[] args) { try { string exeConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}//Log4netDemo.exe.config"; if (File.Exists(exeConfigFile) == false) { throw new Exception($"應用程式配置檔案 [{exeConfigFile}] 不存在,無法載入日誌 log4net 的配置"); } LogUtil.Configure(exeConfigFile,1); LogUtil.Info("====================================== Log4netDemo started,log4net setup..."); LogUtil.Warn("程式啟動入參不合理"); LogUtil.Error("程式啟動失敗"); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex); LogUtil.Error("程式載入失敗",ex); } }
執行程式後,實際輸出效果如下:
以上就是C# 使用 log4net 日誌元件的方法的詳細內容,更多關於C# 使用 log4net 日誌元件的資料請關注我們其它相關文章!