log4donet 的 一篇簡單使用實例
背景
最近在寫一個Adapter,需要調用別的程序的DLL. Adapter使用的是C#還有.net的等方面的技術。今天在寫log這塊,就像嘗試一下有沒有“輪子”可以試試的。在網上搜羅了一番之後,決定就使用“log4net”吧。
關於log4net
簡單來說,她是從log4j衍生出來的專門用於.net領域的一個寫log的類庫。支持 .net stardard,.net core等等。。。
下載
我們可以到 http://logging.apache.org/log4net/download_log4net.cgi 來下載,下載頁面提供了很多種方式(binary or source)
使用
LZ這裏是.net stardard,所以將下載完成後的壓縮包解壓,之後進入bin目錄,找到對應的framework版本,選擇引入“log4net.dll”
個人的想法是把這個記錄log的組件封裝成一個library,所以新建一個ClassLibrary工程,在裏面引入“log4net.dll”並且進行封裝。項目組成如下圖:
其中:
- LogHelper 是一個關於調用Log4net.dll方法的封裝類。
- LogLirary.config 該文件是一個配置文件,裏面詳細記錄的log的輸出/存儲方式
LogHelper.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; [assembly: log4net.Config.XmlConfigurator(ConfigFile = "LogLibrary.config", ConfigFileExtension = ".config", Watch = true)] namespace LogLibary { public enum LogLevel { Debug, Info, Warning, Error }public class LogHelper { public static void WriteLog(Type t, LogLevel logLevel, string msg) { log4net.ILog log = log4net.LogManager.GetLogger(t); switch (logLevel) { case LogLevel.Debug: log.Debug(msg); break; case LogLevel.Info: log.Info(msg); break; case LogLevel.Warning: log.Warn(msg); break; case LogLevel.Error: log.Error(msg); break; default: log.Debug(msg); break; } } public static void WriteLogWithException(Type t, LogLevel logLevel, string msg, Exception ex) { log4net.ILog log = log4net.LogManager.GetLogger(t); switch (logLevel) { case LogLevel.Debug: log.Debug(msg, ex); break; case LogLevel.Info: log.Info(msg, ex); break; case LogLevel.Warning: log.Warn(msg, ex); break; case LogLevel.Error: log.Error(msg, ex); break; default: log.Debug(msg, ex); break; } } } }
標紅的語句非常重要,它表明我們log輸出依賴於configuration
LogLibrary.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--定義輸出到文件中--> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--定義文件存放位置--> <file value="Log\\"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd‘.txt‘"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <layout type="log4net.Layout.PatternLayout"> <!--每條日誌末尾的文字說明--> <!--輸出格式--> <!--樣例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <conversionPattern value="%newline %n記錄時間:%date %n線程ID:[%thread] %n日誌級別: %-5level %n出錯類:%logger property: [%property{NDC}] - %n錯誤描述:%message%newline %n"/> </layout> </appender> <!--定義輸出到控制臺命令行中--> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <!--文件形式記錄日誌--> <appender-ref ref="RollingLogFileAppender" /> <!--控制臺控制顯示日誌--> <appender-ref ref="ConsoleAppender" /> </root> </log4net> </configuration>
最後,寫一個簡單的測試類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using RabbitMQ.Client; using LogLibary; namespace Producer { class Program { static void Main(string[] args) { for (int i = 0; i < 1000; i++) // tested code here { string message = String.Format("Hello there! number is: {0}", i.ToString()); LogHelper.WriteLog(typeof(Program), LogLevel.Debug, string.Format(" set {0}", message)); } LogHelper.WriteLog(typeof(Program), LogLevel.Info, "1000 tasks sent out!!"); Console.ReadKey(); } } }
參考文獻:
http://logging.apache.org/log4net/release/config-examples.html
http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html
OK. 啰啰嗦嗦寫了一堆,感謝大家的收看,預祝各位雙11 “買買買!!”
log4donet 的 一篇簡單使用實例