毋庸置疑,log4net在记日志的功能上无比强大。
但也有诟病的地方,比如配置太麻烦(这里只说记录文件日志,像记入数据库的日志本文不涉及,下同)
之前也看到过园子里有人发的封装成LogHelper的文章,少没少配置我没仔细看,但看下面评论有说日志记录还是有问题的
请教下楼主,使用封装后的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();//创建XmlElement 12 log4net.Config.XmlConfigurator.Configure(element);//配置log4net 13 } 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需要用到的XmlElement 27 /// </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 }
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:logTest"/> 3 </appSettings>
----------------------header--------------------------
2016-11-10 11:42:21,567 [1] INFO _17MCP.Logger.Test.Program [(null)] <(null)> -
test message----------------------footer--------------------------
上面就是记录的内容。
很简单的东西
封装后的log4net传送门在此