C# 使用 log4net 日志組件的方法
一、 什么是 log4net
Apache log4net 庫是幫助程序員將日志語句輸出到各種輸出目標(biāo)的工具,它是從Java中的Log4j遷移過來的一個.Net版的開源日志框架。log4net 的一個顯著特征是分層記錄器的概念,使用這些記錄器可以有選擇地控制任意粒度輸出日志語句。主要特征如下:
- 支持多個框架
- 輸出到多個日志記錄目標(biāo)
- 分層日志記錄體系結(jié)構(gòu)
- XML 配置
- 動態(tài)配置
- 日志記錄上下文
- 久經(jīng)考驗的架構(gòu)
- 模塊化和可擴(kuò)展設(shè)計
- 高性能和靈活性
二、C# 使用 log4net
添加Nuget 包,搜索到“l(fā)og4net”后 ,選擇安裝,具體如下圖所示:
三、添加 log4net 配置文件
使用 log4net需要我們配置log4net的配置文件,目前,配置文件是用 XML 編寫的。一般有兩種方式,一種是使用og4net自動生成的 “l(fā)og4net.xml”進(jìn)行配置,另一種是直接嵌入到運(yùn)行程序的 app.config 文件中。
具體內(nèi)容如下:
<?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>
主要參數(shù)含義如下:
三、源碼測試
我們可以添加一個日志類,專門用于輸出日志打印,具體代碼如下(注意:log4net目前暫時不支持通過配置文件進(jìn)行文件刪除,可通過配置文件設(shè)置文件個數(shù)與大小進(jìn)行覆蓋備份文件。因此,自動刪除日志需要代碼實現(xiàn)):
public static class LogUtil { private static log4net.ILog Log { get; } = log4net.LogManager.GetLogger("log"); /// <summary> /// 日志加載設(shè)置 /// </summary> /// <param name="exeConfigFile">日志配置文件名稱</param> /// <param name="day">保留天數(shù),-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層堆棧,也就忽略了當(dāng)前方法GetMethodName,以及調(diào)用此方法的方法,這樣拿到的就正好是外部調(diào)用打印日志所在函數(shù)的方法信息 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), e); } public static void Warn(string msg) { Log.Warn(msg); } public static void Warn(string msg, Exception e) { Log.Warn(WrapException(msg, e), e); } public static void Error(string msg) { Log.Error(msg); } public static void Error(string msg, Exception e) { Log.Error(WrapException(msg, e), e); } public static void Fatal(string msg) { Log.Fatal(msg); } public static void Fatal(string msg, Exception e) { Log.Fatal(WrapException(msg, e), e); } }
測試代碼如下:
static void Main(string[] args) { try { string exeConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}//Log4netDemo.exe.config"; if (File.Exists(exeConfigFile) == false) { throw new Exception($"應(yīng)用程序配置文件 [{exeConfigFile}] 不存在,無法加載日志 log4net 的配置"); } LogUtil.Configure(exeConfigFile,1); LogUtil.Info("====================================== Log4netDemo started, log4net setup..."); LogUtil.Warn("程序啟動入?yún)⒉缓侠?); LogUtil.Error("程序啟動失敗"); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex); LogUtil.Error("程序加載失敗",ex); } }
運(yùn)行程序后,實際輸出效果如下:
以上就是C# 使用 log4net 日志組件的方法的詳細(xì)內(nèi)容,更多關(guān)于C# 使用 log4net 日志組件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WPF中的ValidationRule實現(xiàn)參數(shù)綁定解決方案
在WPF中,默認(rèn)情況下,DataContext是通過可視化樹來傳遞的,父元素的DataContext會自動傳遞給其子元素,以便子元素可以訪問父元素的數(shù)據(jù)對象,這篇文章主要介紹了WPF中的ValidationRule實現(xiàn)參數(shù)綁定解決方案,需要的朋友可以參考下2023-08-08C#應(yīng)用XML作為數(shù)據(jù)庫的快速開發(fā)框架實現(xiàn)方法
這篇文章主要介紹了C#應(yīng)用XML作為數(shù)據(jù)庫的快速開發(fā)框架實現(xiàn)方法,詳細(xì)介紹了將XML作為數(shù)據(jù)庫的C#桌面應(yīng)用開發(fā)技巧,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12C# PaddleDetection yolo實現(xiàn)印章檢測
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合PaddleDetection yolo實現(xiàn)印章檢測,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11