• 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

  • 相关阅读:
    基于结构化平均感知机的分词器Java实现
    HanLP分词命名实体提取详解
    [英语学习]王秒同学《21天TED英语精练团》
    [不好分类]转帖:好好说话是个“技术活”(李笑来说话太直了?)
    [英语学习]3招速成英语发音 背景音乐和学习随感
    [读书笔记]《番茄工作法图解:简单易行的时间管理方法》
    [英语学习]给宝宝的英语原版资源
    [办公自动化]如何判断服务器是否开放某端口
    [他山之石]Google's Project Oxygen Pumps Fresh Air Into Management
    [读书笔记]云计算时代的网络,读《腾云,云计算和大数据时代网络技术揭秘》
  • 原文地址:https://www.cnblogs.com/panbao/p/6050391.html
Copyright © 2020-2023  润新知