標籤:layout 布局 發送 sum name ica [1] span zip
毋庸置疑,log4net在記日誌的功能上無比強大。
但也有詬病的地方,比如配置太麻煩(這裡只說記錄檔案日誌,像記入資料庫的日誌本文不涉及,下同)
之前也看到過園子裡有人發的封裝成LogHelper的文章,少沒少配置我沒仔細看,但看下面評論有說日誌記錄還是有問題的
#8樓 2014-11-17 15:04 aeiiilowx 請教下樓主,使用封裝後的loghelper類寫日誌,在設定檔的布局裡,用%c、%f或%l 擷取的日誌類、檔案和行號永遠是loghelper類相應的行號了,也就是說不能正確擷取到真正日誌類、檔案和行號了。有遇到這個問題嗎?
這個問題我也遇到了,感覺不爽,當時放棄了。
昨天突然想把這個問題給解決掉,說幹就幹吧
1 /// <summary> 2 /// 記錄日誌Factory 3 /// </summary> 4 public class LogFactory 5 { 6 /// <summary> 7 /// 靜態建構函式 8 /// </summary> 9 static LogFactory()10 {11 var element = CreateConfigElement();//建立XmlElement12 log4net.Config.XmlConfigurator.Configure(element);//配置log4net13 }14 15 /// <summary>16 /// 建立一個ILog,用於記錄日誌17 /// </summary>18 /// <returns></returns>19 public static log4net.ILog CreateLogger()20 {21 StackTrace st = new StackTrace();22 var arr = st.GetFrame(1);23 return log4net.LogManager.GetLogger(arr.GetMethod().DeclaringType);24 }25 /// <summary>26 /// 建立配置log4net需要用到的XmlElement27 /// </summary>28 /// <returns></returns>29 public static XmlElement CreateConfigElement()30 {31 var logDir = ConfigurationManager.AppSettings["LogDirectory"] ?? "";//擷取設定檔中的日誌目錄32 if(string.IsNullOrWhiteSpace(logDir))33 throw new DirectoryNotFoundException("please check the key ‘LogDirectory‘ in appsettings");34 StringBuilder sb=new StringBuilder();35 sb.Append(@"<?xml version=""1.0""?>");36 //sb.Append(@"<configuration>");37 //sb.Append(@"<configSections>");38 //sb.Append(@"<section name=""log4net"" type=""log4net.Config.Log4NetConfigurationSectionHandler, log4net"" />");39 //sb.Append(@"</configSections>");40 sb.Append(@"<log4net>");41 sb.Append(@"<appender name=""myAppender"" type=""log4net.Appender.RollingFileAppender,log4net"">");42 sb.Append(@"<param name=""File"" value="""+logDir+@"""/>");43 sb.Append(@"<param name=""AppendToFile"" value=""true""/>");44 sb.Append(@"<param name=""RollingStyle"" value=""Composite""/>");45 sb.Append(@"<param name=""DatePattern"" value=""yyyy-MM-dd/HH".log"""/>");46 sb.Append(@"<param name=""maximumFileSize"" value=""2MB""/>");47 sb.Append(@"<param name=""maxSizeRollBackups"" value=""100""/>");48 sb.Append(@"<param name=""StaticLogFileName"" value=""false""/>");49 sb.Append(@"<layout type=""log4net.Layout.PatternLayout,log4net"">");50 sb.Append(@"<param name=""ConversionPattern"" value=""%d [%t] %-5p %c [%x] <%X{auth}> - %n%m%n""/>");51 sb.Append(@"<param name=""Header"" value=""
----------------------header--------------------------
""/>");52 sb.Append(@"<param name=""Footer"" value=""
----------------------footer--------------------------
""/>");53 sb.Append(@"</layout>");54 sb.Append(@"<filter type=""log4net.Filter.LevelRangeFilter"">");55 sb.Append(@"<levelMin value=""INFO"" />");56 sb.Append(@"<levelMax value=""ERROR"" />");57 sb.Append(@"</filter>");58 sb.Append(@"</appender>");59 sb.Append(@"<!-- 所有日誌 -->");60 sb.Append(@"<root>");61 sb.Append(@"<!-- 記錄日誌的記錄層級: ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF -->");62 sb.Append(@"<priority value=""ALL""/>");63 sb.Append(@"<appender-ref ref=""myAppender""/>");64 sb.Append(@"</root>");65 sb.Append(@"</log4net>");66 //sb.Append(@"</configuration>");67 68 XmlDocument doc=new XmlDocument();69 doc.LoadXml(sb.ToString());70 return doc.DocumentElement;71 }72 }LogFactory
1 private static readonly log4net.ILog Logger = LogFactory.CreateLogger();2 static void Main(string[] args)3 {4 Logger.Info("test message");5 }使用方法
需要在設定檔內內添加
1 <appSettings>2 <add key="LogDirectory" value="D:\log\Test\"/>3 </appSettings>
----------------------header--------------------------
2016-11-10 11:42:21,567 [1] INFO _17MCP.Logger.Test.Program [(null)] <(null)> -
test message
----------------------footer--------------------------
上面就是記錄的內容。
很簡單的東西
封裝後的log4net傳送門在此
log4net.zip
log4net的封裝