log4net的封装

毋庸置疑,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();//创建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&quot;.log&quot;""/>");
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] &lt;%X{auth}&gt; - %n%m%n""/>");
51             sb.Append(@"<param name=""Header"" value=""&#xD;&#xA;----------------------header--------------------------&#xD;&#xA;""/>");
52             sb.Append(@"<param name=""Footer"" value=""&#xD;&#xA;----------------------footer--------------------------&#xD;&#xA;""/>");
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:logTest"/>
3   </appSettings>

----------------------header--------------------------
2016-11-10 11:42:21,567 [1] INFO _17MCP.Logger.Test.Program [(null)] <(null)> -
test message

----------------------footer--------------------------

上面就是记录的内容。

很简单的东西

封装后的log4net传送门在此

log4net.zip

原文地址:https://www.cnblogs.com/panbao/p/6050391.html