日志模块

对于一个系统来说,日志模块是必不可少的,它能给后面系统的维护和bug的修复,带来极大的方便。.net的日志模块有很多,比较流行的有Log4Net,NLog,还有微软企业库的日志模块,我采用的是Log4Net,

1、接口

由于日志是所有模块都要用到的,因此在核心模块(Core)中实现,为了解耦,自定义一个日志接口ILogger ,参照Log4Net的日志分级,也分为5级,每一级别有1-2个方法, 代码如下。

  1. ILogger /// <summary>
  2. /// 日志操作
  3. /// </summary>
  4. public interface ILogger
  5. {
  6.  
  7. /// <summary>
  8. /// 写日志 日志级别为Debug
  9. /// </summary>
  10. /// <param name="message">消息</param>
  11. void Debug(string message);
  12. /// <summary>
  13. /// 写日志 日志级别为Debug
  14. /// </summary>
  15. /// <param name="format">消息格式字符串</param>
  16. /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
  17. void Debug(string format, params object[] args);
  18. /// <summary>
  19. /// 写日志 日志级别为 Error
  20. /// </summary>
  21. /// <param name="message">消息</param>
  22. void Error(string message);
  23. /// <summary>
  24. /// 写日志 日志级别为 Error
  25. /// </summary>
  26. /// <param name="format">消息格式字符串</param>
  27. /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
  28. void Error(string format, params object[] args);
  29. /// <summary>
  30. /// 写日志 日志级别为 Error
  31. /// </summary>
  32. /// <param name="message">消息</param>
  33. /// <param name="t">系统错误类</param>
  34. void Error(string message, Exception t);
  35.  
  36. /// <summary>
  37. /// 写日志 日志级别为 Info
  38. /// </summary>
  39. /// <param name="message">消息</param>
  40. void Info(string message);
  41. /// <summary>
  42. /// 写日志 日志级别为 Info
  43. /// </summary>
  44. /// <param name="format">消息格式字符串</param>
  45. /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
  46. void Info(string format, params object[] args);
  47.  
  48. /// <summary>
  49. /// 写日志 日志级别为 Warning
  50. /// </summary>
  51. /// <param name="message">消息</param>
  52. void Warning(string message);
  53. /// <summary>
  54. /// 写日志 日志级别为 Warning
  55. /// </summary>
  56. /// <param name="format">消息格式字符串</param>
  57. /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
  58. void Warning(string format, params object[] args);
  59. }

2、实现:
实现就比较简单了,直接调用Log4Net的相关方法即可,代码如下

  1. Log4NetLogger public class Log4NetLogger : ILogger
  2. {
  3. internal Log4NetLogger()
  4. : this(typeof(ILogger))
  5. {
  6. }
  7.  
  8. internal Log4NetLogger(Type type)
  9. {
  10. log4net.Config.XmlConfigurator.Configure();
  11. Log = log4net.LogManager.GetLogger(type);
  12. }
  13.  
  14. log4net.ILog Log;
  15.  
  16. #region Implementation of ILogger
  17.  
  18. public void Warning(string message)
  19. {
  20. Log.Warn(message);
  21. }
  22.  
  23. public void Debug(string message)
  24. {
  25. Log.Debug(message);
  26. }
  27.  
  28. public void Info(string message)
  29. {
  30. Log.Info(message);
  31. }
  32.  
  33. public void Error(string message)
  34. {
  35. Log.Error(message);
  36. }
  37.  
  38. public void Error(string message, Exception t)
  39. {
  40. Log.Error(message);
  41. Log.ErrorFormat("Error: {0}, exception: {1}", t.Message, t);
  42. }
  43.  
  44. public void Debug(string format, params object[] args)
  45. {
  46. Log.DebugFormat(format, args);
  47. }
  48.  
  49. public void Error(string format, params object[] args)
  50. {
  51. Log.ErrorFormat(format, args);
  52. }
  53.  
  54. public void Info(string format, params object[] args)
  55. {
  56. Log.InfoFormat(format, args);
  57. }
  58.  
  59. public void Warning(string format, params object[] args)
  60. {
  61. Log.WarnFormat(format, args);
  62. }
  63. #endregion
  64. }

为了使用方便,增加一个工厂类,用于创建日志接口,代码如下

  1. LogFactory /// <summary>
  2. /// 日志工厂
  3. /// </summary>
  4. public class LogFactory {
  5. /// <summary>
  6. /// 获得一个日志操作类
  7. /// </summary>
  8. /// <param name="type">类型</param>
  9. /// <returns>日志操作类</returns>
  10. public static ILogger GetLogger(Type type) {
  11. return new Log4NetLogger(type);
  12. }
  13. }

为什么没有用设计的Ioc的方法呐?考虑到,如果用IOC的方式,万一在Ioc初始化之前以及初始化过程中,出现问题,会造成系统的崩溃,而此时日志接口也不能获得,也就无法记录错误日志。基于这个考虑,所有没有用Ioc的思想去是实现。Log4netLogger实例化方法是internal修饰的,不能在core外部实例化,这样就只有LogFactory 一个创建的入口了。

3、使用

比如我在另外一个项目里有一个 FrmView的窗体,要在这个里面写日志,只需要加入 ILogger Log = LogFactory.GetLogger(typeof(FrmView));用Log实例就可以了,这个项目也不要添加Log4Net的引用。有关Log4Net的配置,园子里有很多高手写的文章,都非常好,我在这里就不多说了。

4、总结

日志模块比较简单,没有什么复杂的业务逻辑,也没有高深的技术含量。但是确是最实用的一个模块。我也是根据我自己的理解设计的,欢迎各位高手指教。

我的开发框架(WinForm)4的更多相关文章

  1. 开发框架(WinForm)3

    我的开发框架(WinForm)3 今天继续给大家介绍核心库的IOC的使用,在我的框架里,IOC使用的比较简单,主要是用于解除模块间的耦合和实例化接口. 1.接口说明,IocContainer接口比较简 ...

  2. RDIFramework.NET敏捷开发框架WinForm新增文件中心-实现附件集中管理

    1.引言 文件中心类似附件管理是一个非常实用功能,可以归档自己平时所需要的文件,也可以把文件分享给别人,更像一个知识中心.文件中心主界面如下图所示,左侧"附件分类"展示了用户对文件 ...

  3. 我的开发框架(WinForm)2

    上篇文章简单的介绍了一下,我的一个开发框架.看的人还不少,多谢大家的关注,我继续介绍一下,模块和模块之间是怎么组织起来的. Data模块: 该模块主要完成对数据的操作,采用仓储模式实现,在核心模块(C ...

  4. 我的开发框架(WinForm)

    近来,看园子里,好多同学,展示自己工作中的开发框架,有的功能强大,有的短小精悍,我也来凑个热闹,望各位大侠指点一二. 一.指导思想 1.尽量减少程序员对数据库的依赖,或者说尽力少的写sql 语句.根据 ...

  5. 我的开发框架(WinForm)3

    今天继续给大家介绍核心库的IOC的使用,在我的框架里,IOC使用的比较简单,主要是用于解除模块间的耦合和实例化接口. 1.接口说明,IocContainer接口比较简单只有3个方法,但是是系统中用的最 ...

  6. WinForm开发中通用附件管理控件设计开发参考

    1.引言 在WinForm开发中,文件附件的管理几乎在任何一个应用上都会存在,是一个非常通用集中的公共模块.我们日常记录会伴随着有图片.文档等附件形式来展现,如果为每个业务对象都做一个附件管理,或者每 ...

  7. RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...

  8. RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET敏捷开发框架介绍 RDIFramewo ...

  9. RDIFramework.NET敏捷开发框架Web新增邮件中心实现便捷式的邮件收发

    1.引言 邮件收发在很多业务系统中都有这样的需求,是比较正式和常用的功能.在我们的框架中提供了邮件中心功能模块,集内部邮件的收发.邮件归类.邮件星标的标记.邮件的删除与彻底删除等,邮件中心功能模块界面 ...

随机推荐

  1. MAC下显示或者隐藏文件的命令

    显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏Mac隐藏文件的命令:defaults writ ...

  2. 《UNIX环境高级编程 第2版》读书笔记

    CH1-2:基础知识.标准化 1 文件和目录 文件名:不能含/(分隔路径)和null(终止路径),255字符. 目录处理:opendir() readdir() closedir() 更改工作目录:c ...

  3. Storm因机器断电等,启动supervisor异常

    Storm因机器断电等,启动supervisor错误 因机器断电或其他异常导致的supervisor意外终止,再次启动时报错: 2014-08-13 10:36:03 b.s.event [ERROR ...

  4. leetcode@ [139/140] Word Break & Word Break II

    https://leetcode.com/problems/word-break/ Given a string s and a dictionary of words dict, determine ...

  5. 【转】 hive简介,安装 配置常见问题和例子

    原文来自:  http://blog.csdn.net/zhumin726/article/details/8027802 1 HIVE概述 Hive是基于Hadoop的一个数据仓库工具,可以将结构化 ...

  6. uCos 之 TaskIdle() 注意事项【worldsing笔记】

    在大多OS里都存在Idle线程或任务,同样uCos也不例外,为什么估计很少有人细研究.为什么设立Idle? 能不能去了? 首先看看uCos中关于Idle的代码做个介绍: config.h里对Idle的 ...

  7. Android 图片加载[常见开源项目汇总]

    该文主要是讲一下目前有哪些使用比较多的 图片加载开源项目,并简单介绍该如果使用 以及各开源项目之间有什么区别, 我们该如何去选择适合的开源项目应用到我们的项目中? 一.Android-Universa ...

  8. 解决ecshop在线客户点击无法唤醒QQ问题

    找到default/library/page_footer.lbi中找到QQ代码的相应位置,然后你会发现之前模板里面为什么QQ点击不能对话,是因为QQ客服安装包中的JS代码有的可能是比较旧的代码了. ...

  9. android studio 真机调试

    1.使用usb连接电脑,打开开发者选项,打开usb调试. 2.不能使用仅充电,修改为媒体设备(MTP) 3.如果无法连接可以使用豌豆荚或者金山手机助手连接. 4.运行android程序即可. 5.如果 ...

  10. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...