日志模块

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

1、接口

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

ILogger /// <summary>
/// 日志操作
/// </summary>
public interface ILogger
{ /// <summary>
/// 写日志 日志级别为Debug
/// </summary>
/// <param name="message">消息</param>
void Debug(string message);
/// <summary>
/// 写日志 日志级别为Debug
/// </summary>
/// <param name="format">消息格式字符串</param>
/// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
void Debug(string format, params object[] args);
/// <summary>
/// 写日志 日志级别为 Error
/// </summary>
/// <param name="message">消息</param>
void Error(string message);
/// <summary>
/// 写日志 日志级别为 Error
/// </summary>
/// <param name="format">消息格式字符串</param>
/// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
void Error(string format, params object[] args);
/// <summary>
/// 写日志 日志级别为 Error
/// </summary>
/// <param name="message">消息</param>
/// <param name="t">系统错误类</param>
void Error(string message, Exception t); /// <summary>
/// 写日志 日志级别为 Info
/// </summary>
/// <param name="message">消息</param>
void Info(string message);
/// <summary>
/// 写日志 日志级别为 Info
/// </summary>
/// <param name="format">消息格式字符串</param>
/// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
void Info(string format, params object[] args); /// <summary>
/// 写日志 日志级别为 Warning
/// </summary>
/// <param name="message">消息</param>
void Warning(string message);
/// <summary>
/// 写日志 日志级别为 Warning
/// </summary>
/// <param name="format">消息格式字符串</param>
/// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
void Warning(string format, params object[] args);
}

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

Log4NetLogger public class Log4NetLogger : ILogger
{
internal Log4NetLogger()
: this(typeof(ILogger))
{
} internal Log4NetLogger(Type type)
{
log4net.Config.XmlConfigurator.Configure();
Log = log4net.LogManager.GetLogger(type);
} log4net.ILog Log; #region Implementation of ILogger public void Warning(string message)
{
Log.Warn(message);
} public void Debug(string message)
{
Log.Debug(message);
} public void Info(string message)
{
Log.Info(message);
} public void Error(string message)
{
Log.Error(message);
} public void Error(string message, Exception t)
{
Log.Error(message);
Log.ErrorFormat("Error: {0}, exception: {1}", t.Message, t);
} public void Debug(string format, params object[] args)
{
Log.DebugFormat(format, args);
} public void Error(string format, params object[] args)
{
Log.ErrorFormat(format, args);
} public void Info(string format, params object[] args)
{
Log.InfoFormat(format, args);
} public void Warning(string format, params object[] args)
{
Log.WarnFormat(format, args);
}
#endregion
}

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

LogFactory /// <summary>
/// 日志工厂
/// </summary>
public class LogFactory {
/// <summary>
/// 获得一个日志操作类
/// </summary>
/// <param name="type">类型</param>
/// <returns>日志操作类</returns>
public static ILogger GetLogger(Type type) {
return new Log4NetLogger(type);
}
}

为什么没有用设计的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. redis-3.0.0集群的安装及使用

    redis集群需要至少6个节点(偶数节点),3个主节点,3个从节点.注意:集群模式最好不要keys *查询数据. 1 下载redis,官网下载3.0.0版本,之前2.几的版本不支持集群模式.下载地址: ...

  2. “菜单”(menubar)和“工具栏”(toolbars)

    "菜单"(menubar)和"工具栏"(toolbars) "菜单" (menubar)和"工具栏"(toolbars) ...

  3. Solaris10下Telnet、SSH、ftp使用root登录

    学习solaris过程中,使用SecureCRT.putty等工具用root账号登录,总是登录不上去,后来经老师解答和网上找答案,发现是 solaris默认是不可以远程使用root账号登录的,如果想开 ...

  4. ZOJ3469 Food Delivery 区间DP

    题意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以V-1的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了 ...

  5. 2.2CUDA-Memory(存储)和bank-conflict

    在CUDA基本概念介绍有简单介绍CUDA memory.这里详细介绍: 每一个线程拥有自己的私有存储器,每一个线程块拥有一块共享存储器(Shared memory):最后,grid中所有的线程都可以访 ...

  6. 【Java基础】Java设计模式简介

    什么是设计模式 设计模式(Design pattern)是一套被反复使用.被多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计 ...

  7. 关于Java线程

    1 概念 通常来说,我们编写的Java代码是以进程的形式来运行的,所编写的代码就是“程序”,而执行中的程序就是“进程”.进程是系统进行资源分配和调度的独立单位. 线程是位于进程的下一级,是系统中的最小 ...

  8. Sort--冒泡排序

    冒泡排序 public class BubbleSort { public static void bubblesort(int[] a){ for(int i=0;i<a.length-1;i ...

  9. 【noip2005】篝火晚会

    题解: 首先我们要知道一个性质: 把长度为n的序列变成目标序列最多需要n个操作 证明1: 我们可以将原序列上每位上的数字向目标序列相同位置的数字连一条有向边 如: 原序列:   1 2 3 目标序列: ...

  10. URL编码原理解释

    当你在浏览器中输入一个URL时,浏览器会将你输入到地址栏的非数字字母转化为URI编码. 那么,它是按照什么样的规则来转换的呢 是这样的,URI编码就是一个字符的ASCII码,它的ACSII码的十六进制 ...