热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Log4net终结版

http:blog.csdn.netpfe_novaarticledetails20072137继上一篇Log4net的整理已经多时,最近闲时把log4net封装了下

    http://blog.csdn.net/pfe_nova/article/details/20072137

 继上一篇Log4net的整理已经多时,最近闲时把log4net封装了下,针对一些可能的需求进行了调查,例如多级别日志和多文件日志。


1.单文件日志

        对于单文件的日志,封装代码如下:


[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public enum LogMessageType  
  2. {  
  3.     Debug,  
  4.     Info,  
  5.     Warn,  
  6.     Error,  
  7.     Fatal  
  8. }  
  9. public sealed class LogProvider  
  10. {  
  11.     private static readonly ILog provider = GetLogger();  
  12.     static LogProvider() { }  
  13.     private LogProvider() { }  
  14.   
  15.     public static void Write(string msg, LogMessageType msgType, Exception ex = null)  
  16.     {  
  17.         WriteLog(msg, msgType, ex);  
  18.     }  
  19.     public static void InitConfig()  
  20.     {  
  21.         XmlConfigurator.Configure();  
  22.     }  
  23.     public static void ShutDown()  
  24.     {  
  25.         LogManager.Shutdown();  
  26.     }  
  27.   
  28.     private static ILog GetLogger()  
  29.     {  
  30.         InitConfig();  
  31.         return LogManager.GetLogger("DefaultLogger");  
  32.     }  
  33.     private static void WriteLog(string msg, LogMessageType msgType, Exception ex)  
  34.     {  
  35.         if (provider != null)  
  36.         {  
  37.             switch (msgType)  
  38.             {  
  39.                 case LogMessageType.Debug:  
  40.                     provider.Debug(msg, ex);  
  41.                     break;  
  42.                 case LogMessageType.Info:  
  43.                     provider.Info(msg, ex);  
  44.                     break;  
  45.                 case LogMessageType.Warn:  
  46.                     provider.Warn(msg, ex);  
  47.                     break;  
  48.                 case LogMessageType.Error:  
  49.                     provider.Error(msg, ex);  
  50.                     break;  
  51.                 case LogMessageType.Fatal:  
  52.                     provider.Fatal(msg, ex);  
  53.                     break;  
  54.             }  
  55.         }  
  56.     }  
  57. }  


        这样所有要记日志的地方只需要LogProvider.Write("this is Log", LogMessageType.Error);一行代码即可,Log4net初始化工作封装在初始化器中,在第一次调用Log4net时进行自动初始化。LogProvider类开放出三个静态方法:Write、InitConfig、ShutDown,后两者用于在程序中手动控制Log4net的开启和关闭;Write方法采用默认参数,达到重载的效果。配置文件如下:


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. xml version="1.0"?>  
  2. <configuration>  
  3.   <configSections>  
  4.     <section name&#61;"log4net"   
  5.              type&#61;"log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  
  6.   configSections>  
  7.   <log4net>  
  8.     <logger name&#61;"DefaultLogger">  
  9.       <level value&#61;"ALL"/>  
  10.       <appender-ref ref&#61;"txtLogger" />  
  11.     logger>  
  12.     <appender name&#61;"txtLogger"   
  13.               type&#61;"log4net.Appender.RollingFileAppender,log4net" >  
  14.       <File value&#61;"Log\Log.txt" />  
  15.       <datePattern value&#61;"(yyyyMMdd)"/>  
  16.       <appendToFile value&#61;"true"/>  
  17.       <RollingStyle value&#61;"Composite"/>  
  18.       <MaxSizeRollBackups value&#61;"10"/>  
  19.       <maximumFileSize value&#61;"1MB"/>  
  20.       <layout type&#61;"log4net.Layout.PatternLayout">  
  21.         <conversionPattern value&#61;"%date [%t]%-5p %c - %m%n"/>  
  22.       layout>  
  23.     appender>  
  24.   log4net>  
  25.   <startup/>  
  26. configuration>  


        唯一要注意的就是这个用来关联&#xff0c;帮助类中要和配置文件中一致&#xff0c;其他的参数说明参照这以前写的
log4net的配置详解



2.分级别记录日志


        重构代码时我想起我们原来的日志框架有个功能是把不同级别的日志分开记录的&#xff0c;例如把奔溃和错误记在一起一个文件中&#xff0c;警告和信息记在一个文件中&#xff0c;查问题时就可以先看重大错误。针对这个需求调查了下&#xff0c;也可以在配置文件中配置的&#xff0c;配置文件如下&#xff1a;


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. xml version&#61;"1.0"?>  
  2. <configuration>  
  3.   <configSections>  
  4.     <section name&#61;"log4net"   
  5.              type&#61;"log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  
  6.   configSections>  
  7.   <log4net>  
  8.     <logger name&#61;"DefaultLogger">  
  9.       <level value&#61;"ALL"/>  
  10.       <appender-ref ref&#61;"InfoLoging" />  
  11.       <appender-ref ref&#61;"ErrorLoging" />  
  12.     logger>  
  13.       
  14.     <appender name&#61;"InfoLoging"   
  15.               type&#61;"log4net.Appender.RollingFileAppender,log4net" >  
  16.       <File value&#61;"Log\LogTipMsg.txt" />  
  17.       <datePattern value&#61;"(yyyyMMdd)"/>  
  18.       <appendToFile value&#61;"true"/>  
  19.       <RollingStyle value&#61;"Composite"/>  
  20.       <MaxSizeRollBackups value&#61;"10"/>  
  21.       <maximumFileSize value&#61;"1MB"/>  
  22.       <layout type&#61;"log4net.Layout.PatternLayout">  
  23.         <conversionPattern value&#61;"%date [%t]%-5p %c - %m%n"/>  
  24.       layout>  
  25.       <filter type&#61;"log4net.Filter.LevelRangeFilter">  
  26.         <LevelMin value&#61;"DEBUG"/>  
  27.         <LevelMax value&#61;"Warn"/>  
  28.       filter>  
  29.     appender>  
  30.       
  31.     <appender name&#61;"ErrorLoging"   
  32.               type&#61;"log4net.Appender.RollingFileAppender,log4net" >  
  33.       <File value&#61;"Log\LogErrorMsg.txt" />  
  34.       <datePattern value&#61;"(yyyyMMdd)"/>  
  35.       <appendToFile value&#61;"true"/>  
  36.       <RollingStyle value&#61;"Composite"/>  
  37.       <MaxSizeRollBackups value&#61;"10"/>  
  38.       <maximumFileSize value&#61;"1MB"/>  
  39.       <layout type&#61;"log4net.Layout.PatternLayout">  
  40.         <conversionPattern value&#61;"%date [%t]%-5p %c - %m%n"/>  
  41.       layout>  
  42.       <filter type&#61;"log4net.Filter.LevelRangeFilter">  
  43.         <LevelMin value&#61;"ERROR" />  
  44.       filter>  
  45.     appender>  
  46.   log4net>  
  47.   <startup/>  
  48. configuration>  


3.按业务逻辑记录日志


        另一个情况就是按业务模块记录到不同的文件中&#xff0c;此时同样可以通过配置来获得&#xff0c;配置文件如下&#xff1a;


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. xml version&#61;"1.0"?>  
  2. <configuration>  
  3.   <configSections>  
  4.     <section name&#61;"log4net"  
  5.              type&#61;"log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  
  6.   configSections>  
  7.   <log4net>  
  8.     <logger name&#61;"DefaultLogger">  
  9.       <level value&#61;"ALL"/>  
  10.       <appender-ref ref&#61;"InfoLoging" />  
  11.       <appender-ref ref&#61;"ErrorLoging" />  
  12.     logger>  
  13.     <logger name&#61;"OtherCustomerLogger">  
  14.       <level value&#61;"Info"/>  
  15.       <appender-ref ref&#61;"OtherInfoLoging" />  
  16.     logger>  
  17.       
  18.     <appender name&#61;"InfoLoging"   
  19.               type&#61;"log4net.Appender.RollingFileAppender,log4net" >  
  20.       <File value&#61;"Log\LogTipMsg.txt" />  
  21.       <datePattern value&#61;"(yyyyMMdd)"/>  
  22.       <appendToFile value&#61;"true"/>  
  23.       <RollingStyle value&#61;"Composite"/>  
  24.       <MaxSizeRollBackups value&#61;"10"/>  
  25.       <maximumFileSize value&#61;"1MB"/>  
  26.       <layout type&#61;"log4net.Layout.PatternLayout">  
  27.         <conversionPattern value&#61;"%date [%t]%-5p %c - %m%n"/>  
  28.       layout>  
  29.       <filter type&#61;"log4net.Filter.LevelRangeFilter">  
  30.         <LevelMin value&#61;"DEBUG"/>  
  31.         <LevelMax value&#61;"Warn"/>  
  32.       filter>  
  33.     appender>  
  34.       
  35.     <appender name&#61;"ErrorLoging"   
  36.               type&#61;"log4net.Appender.RollingFileAppender,log4net" >  
  37.       <File value&#61;"Log\LogErrorMsg.txt" />  
  38.       <datePattern value&#61;"(yyyyMMdd)"/>  
  39.       <appendToFile value&#61;"true"/>  
  40.       <RollingStyle value&#61;"Composite"/>  
  41.       <MaxSizeRollBackups value&#61;"10"/>  
  42.       <maximumFileSize value&#61;"1MB"/>  
  43.       <layout type&#61;"log4net.Layout.PatternLayout">  
  44.         <conversionPattern value&#61;"%date [%t]%-5p %c - %m%n"/>  
  45.       layout>  
  46.       <filter type&#61;"log4net.Filter.LevelRangeFilter">  
  47.         <LevelMin value&#61;"ERROR" />  
  48.       filter>  
  49.     appender>  
  50.       
  51.     <appender name&#61;"OtherInfoLoging"   
  52.               type&#61;"log4net.Appender.RollingFileAppender,log4net" >  
  53.       <File value&#61;"Log\LogOtherInfoLoging.txt" />  
  54.       <datePattern value&#61;"(yyyyMMdd)"/>  
  55.       <appendToFile value&#61;"true"/>  
  56.       <RollingStyle value&#61;"Composite"/>  
  57.       <MaxSizeRollBackups value&#61;"10"/>  
  58.       <maximumFileSize value&#61;"1MB"/>  
  59.       <layout type&#61;"log4net.Layout.PatternLayout">  
  60.         <conversionPattern value&#61;"%date [%t]%-5p %c - %m%n"/>  
  61.       layout>  
  62.     appender>  
  63.   log4net>  
  64.   <startup/>  
  65. configuration>  


        此时帮助类就要适当的调整了&#xff0c;代码如下&#xff1a;


[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public enum LogicType  
  2. {  
  3.     DefaultLogger,  
  4.     OtherCustomerLogger  
  5. }  
  6. public enum LogMessageType  
  7. {  
  8.     Debug,  
  9.     Info,  
  10.     Warn,  
  11.     Error,  
  12.     Fatal  
  13. }  
  14. public sealed class LogProvider  
  15. {  
  16.     static LogProvider() { }  
  17.     private LogProvider() { }  
  18.   
  19.     private static readonly Dictionary<string, ILog> dicLoggers &#61; GetLoggers();  
  20.   
  21.     public static void Write(string msg, LogMessageType msgType, Exception ex &#61; null)  
  22.     {  
  23.         WriteLog(msg, msgType, ex);  
  24.     }  
  25.     public static void Write(string msg,   
  26.         LogMessageType msgType, LogicType logicType, Exception ex &#61; null)  
  27.     {  
  28.         WriteLog(msg, msgType, ex, logicType.ToString());  
  29.     }  
  30.     public static void InitConfig()  
  31.     {  
  32.         XmlConfigurator.Configure();  
  33.     }  
  34.     public static void ShutDown()  
  35.     {  
  36.         LogManager.Shutdown();  
  37.     }  
  38.   
  39.     static Dictionary<string, ILog> GetLoggers()  
  40.     {  
  41.         InitConfig();  
  42.         ILog[] allLoggers &#61; LogManager.GetCurrentLoggers();  
  43.         Dictionary<string, ILog> dicLoggers &#61; new Dictionary<string, ILog>();  
  44.         foreach (var logger in allLoggers)  
  45.         {  
  46.             dicLoggers.Add(logger.Logger.Name, logger);  
  47.         }  
  48.         return dicLoggers;  
  49.     }  
  50.     static void WriteLog(string msg,   
  51.         LogMessageType msgType, Exception ex, string logicType &#61; "DefaultLogger")  
  52.     {  
  53.         if (dicLoggers !&#61; null && dicLoggers[logicType] !&#61; null)  
  54.         {  
  55.             switch (msgType)  
  56.             {  
  57.                 case LogMessageType.Debug:  
  58.                     dicLoggers[logicType].Debug(msg, ex);  
  59.                     break;  
  60.                 case LogMessageType.Info:  
  61.                     dicLoggers[logicType].Info(msg, ex);  
  62.                     break;  
  63.                 case LogMessageType.Warn:  
  64.                     dicLoggers[logicType].Warn(msg, ex);  
  65.                     break;  
  66.                 case LogMessageType.Error:  
  67.                     dicLoggers[logicType].Error(msg, ex);  
  68.                     break;  
  69.                 case LogMessageType.Fatal:  
  70.                     dicLoggers[logicType].Fatal(msg, ex);  
  71.                     break;  
  72.             }  
  73.         }  
  74.     }  
  75. }  


        增加了LogicType这个枚举&#xff0c;记录特定业务逻辑日志时LogProvider.Write("this is Other Info", LogMessageType.Info, LogicType.OtherCustomerLogger)。实际操作时就是根据业务逻辑扩充这个枚举。


        至此&#xff0c;这个版本已经能够直接拿到项目中用了&#xff0c;只需配置即可&#xff0c;不需要额外改动代码。

        后记&#xff1a;在封装过程中也遇到了一些问题&#xff0c;例如readonly和静态构造函数的问题&#xff0c;当时对其理解不够彻底&#xff0c;疑惑了一阵&#xff0c;以后有空一并总结出来。虽然是终结版&#xff0c;能够作为项目的稳定版本&#xff0c;但也还有一些不足&#xff0c;例如只想滚动保存6个月的日志&#xff0c;现在就不知道log4net能不能实现&#xff08;或者说怎么实现&#xff0c;如果让我实现我就只能另外写个线程每天遍历一次&#xff0c;如果有6个月前的日志就将其删掉&#xff09;。希望能对读者有些帮助&#xff0c;如果有什么错误或想法&#xff0c;还望不吝指教&#xff0c;转载请保留原文链接。

        源代码下载


推荐阅读
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
author-avatar
mobiledu2502857673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有