自由、创新、研究、探索……

Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]
posts - 497, comments - 1951, trackbacks - 134, articles - 55
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
一、背景
为软件开发提供一个现成的、定义良好的、可扩展的日志设施。所谓"现成的"意思为软件开发可以即刻使用,包括API文档、使用实例和库;"定义良好的"表示项目提供良好的使用接口和具有优秀的内部设计;可扩展的意味用户可以进一步扩展功能。
关心软件日志的主要有三类用户:开发人员、系统管理人员和系统运行单位。三类用户各有各的日志需求:
l         开发人员在写代码的时候经常要输出程序的内部状态,目的可以是开发时的调试,或运行时的维护。
l         系统管理人员需要获取软件的状态数据以便进一步配置系统使其正常和高效运行。
l         系统运行单位需要软件保存操作日志以便例行检查或秋后算账。
虽然三类用户各有各的需求,对于日志设施来说可以归结为以下功能特性:
1.        日志操作:日志功能是指基本的日志登记操作,是软件系统和日志设施之间的简单接口。软件系统一般只向这些功能传递应用日志信息。
2.        级别:级别是指软件系统可以分级别地进行日志登记操作。日志设施的级别特性表现为日志操作和设施配置两部分。日志操作的级别表现为软件系统可以指定某次日志登记的级别,设施配置的级别规定了有效的日志操作的最低级别。如果软件系统中某个日志操作的级别低于配置指定级别,这个日志操作是无效的,既不会发生日志登记行为。日志设施的级别性对于开发人员来说非常有用,它一方面有助于开发人员调式系统时了解详尽的系统状态信息,另一方面有利于开发人员对运行时软件系统故障的诊断和问题解决。而且系统从开发状态到运行状态转变时,开发人员插入到软件中的调式日志代码不需要删除,只需要提高日志的配置级别,并且最终使得程序员对System.Console.Write的嗜好已成为过去。
3.        日志目标多样性:日志目标的多样性指日志可以被登记到多个日至设备,比如文件、控制台、数据库、邮件系统等。日志目标多样性使得软件系统可以按照某种标准把日志输出到不同的设备上,比如调试用的日志一般可以输出到控制台,例行检查的日志可以保存到数据库中,系统出错的日志可以发通过邮件系统发到管理员或维护员邮箱。
4.        日志格式:作为一种设施,除了登记软件系统指定的应用日志信息之外,日志设施往往还提供一些额外的系统日志信息,比如系统时间,日志发生的上下文等,而且能对所有的日志信息进行格式编排。日志格式一般在日志设施的配置文件中设置,有助于节省软件系统调用日志操作接口时的编程负担,降低接口的复杂度。
值得注意的是软件系统到底往日志设备中记录什么东西,也就是说应用日志信息的具体内容由运用日志设施的软件系统决定,与日志设施没有直接关系。
二、解决方案
   目前有许多日志的实现,像log4net,nlog,logging application block,避免对某一实现的依赖就是通用日志所要做的事情。在Castle项目和Spring.NET中的实现是不一样的,Castle所采用通用日志接口定义于框架核心Castle.Core.LoggingSpring.NET采用单独的程序集方式。Spring.NET的日志叫做“Common.Logging”,应该是移植自JCL(Jakarta Commons Logging)。从使用上来说Spring.NET的日志更为通用。
     下面介绍一下Spring.NETCommon.Logging, 你项目中没有使用Castle,Spring.NET也一样可以使用这样的一个通用日志接口,而且很容易就和log4net,nlog,logging application block集成。
      commons-logging是个日志设施通用实现,虽然提供了对应用编程接口的缺省实现(SimpleLog,但是主要意图还是希望封装强大的日志系统。明白了这一点,我们就面临这样的场景:一边有现成的日志系统,如log4net,nlog,logging application block;另一边有易用的使用界面。我们需要一种设计能使这两边协调工作,设计模式-适配模式是我们的理想选择。

 

既然commons-logging是一个通用接口,它的实现就不能和某个具体的日志系统绑死。我们需要一种能在代码外实现这种绑定的设计。一般地我们用gang of four creational模式类中的一种模式来创建实现某个接口的类的实例,commons-logging采用了工厂方法模式来选择具体的日志实现。下表引入工厂方法模式描述。

 

common logging 提供简单的日志实现,目前提供的是无输出,控制台,Trace(以上三种实现,在配置文件factoryAdapter type attribute中有简写方式NOOP,CLOSE,TRACE. 简单的配置如下:

 <configSections>

 
<sectionGroup name="common">
 
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
 
</sectionGroup>

 
</configSections>

 
<common>
 
<logging>
 
<factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
 
<arg key="showLogName" value="true" />
 
<arg key="showDataTime" value="true" />
 
<arg key="level" value="DEBUG" />
 
<arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:fff" />
 
</factoryAdapter>
 
</logging>
 
</common>
和Log4Net搭配使用也很容易的,加入如下配置就可以了:
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
 
<!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
 
<!-- otherwise BasicConfigurer.Configure is used -->
 
<!-- log4net configuration file is specified with key configFile-->
 
<arg key="configType" value="INLINE" />
 
</factoryAdapter>
 
</logging>
log4net这两个版本(log4net 1.2.9和log4net1.2.10)的程序集都使用强命名,所以有两个分别针对log4net 1.2.9和log4net1.2.10有两个版本的实现。

.NET开源项目介绍及资源推荐:日志记录
自由、创新、研究、探索……
Url: http://shanyou.cnblogs.com
website: http://www.openbeta.cn

Feedback

#1楼    回复  引用  查看    

2007-12-30 11:57 by 一滴水      
Common.Logging.net 是一个单独开源的项目主页
http://netcommon.sourceforge.net/

开始用log4net 现在换成Common.Logging.net + log4net :)

#2楼    回复  引用  查看    

2007-12-30 12:34 by Jeffrey Zhao      
看了不少介绍,其实发现日志组件好像都差不多,比如log4net或entlib里的logging app block,有人比较过吗?

#3楼    回复  引用  查看    

2007-12-30 13:39 by jjx      
现在想起来,我在1年就就介绍了common logging ,呵呵 事件过的可真快
http://bbs.dotnettools.org/NewsDetail.asp?id=5760

#4楼    回复  引用  查看    

2007-12-30 14:08 by 蛙蛙池塘      
总结的8错,俺在写一套自己的tracing组件呢。
其实log和trace一般不是一回事吧。log有可能是操作的log,比如删除了个用户,删除了个文章啥的,这是业务性的,trace一般都是为诊断程序用的吧。

#5楼    回复  引用  查看    

2007-12-30 15:09 by 阿不      
现在都不想去用这些东西了,asp.net 2.0中提供的已经够用了。

#6楼    回复  引用  查看    

2007-12-30 19:35 by 蛙蛙池塘      
@阿不
asp.net提供什么了呀?

#7楼    回复  引用  查看    

2007-12-30 21:08 by Jeffrey Zhao      
@蛙蛙池塘
log和tracing其实有些时候也差不多。
log不是分级了吗?然后我们可以通过配置来控制写入哪些级别的东西。trace就是级别(重要度)比较低,详细,冗余的信息,在开发时开启,产品环境去除的log。

#8楼    回复  引用  查看    

2007-12-30 21:38 by Anders Cui      
@蛙蛙池塘
trace可以看作log内容的一种吧

#9楼    回复  引用  查看    

2007-12-31 11:39 by 蛙蛙池塘      
@Anders Cui
@Jeffrey Zhao
恩,可能理解的不一样吧,我是按我的理解去理解的,呵呵。

#10楼 [楼主]   回复  引用  查看    

2008-01-01 09:47 by 自由、创新、研究、探索……      
@蛙蛙池塘
log涵盖trace了,所以没有必要单独写一个组件。通过不同的级别来控制。
@阿不
asp.net 2.0提供的对于一个产品来说还是不足的
@Jeffrey Zhao
log4net,nlog,logging application block都是对日志系统的具体实现,功能都一样。common-logging是日志设施通用实现,所以用Common.Logging.net + log4net/nlog/app log block等

#11楼    回复  引用  查看    

2008-01-02 09:24 by Clark Zheng      
说起这个“Castle.Core.Logging”使用强名称,我就是一肚子委屈,唉,看了半天代码才改成可以使公司改过的log4.net。。。

#12楼    回复  引用  查看    

2008-01-02 09:24 by Clark Zheng      
PS:新皮肤不错,很鲜艳,新年新气象呀

#13楼    回复  引用  查看    

2008-01-08 09:13 by 阿不      
@自由、创新、研究、探索……
对我来说,我还是觉得如果框架已经有的东西,就没有必要再去用第三方的东西。除非你有特殊需求。
在.net 2.0里面,它的设计还是很容易扩展的。

#14楼 [楼主]   回复  引用  查看    

2008-01-09 12:16 by 自由、创新、研究、探索……      
@阿不
产品需要考虑扩展性,.net fx为我们提供的永远是基础性的东西。真正达到应用产品的需求还是需要认真设计的