部署系统以后,管理员需要有一套强大的日志系统来诊断和修复配置上的问题,这就需要一套通过配置就可以变更日志记录的方式。经验表明,日志模块往往是软件开发周期中的重要组成部分,Aicken曾用过一段时间的Log4Net,Log4Net是个很不错的日志框架,但是有时候仍然觉得有些不顺手,例如,需要用不同类型的日志记录不同的类、方法的行为和不同的业务行为,有时需要在系统运行期,改变某个业务日志的记录介质或是否记录等等,遇到这些因素Log4Net可能需要修改代码重新编译,而IsLine FrameWork的AppLogProvider模块可以只修改配置文件就可满足需求,它具有以下几个优点:
- 它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;
- 一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。
- 不同的日志信息可以输出到不同的地方(控制台、文件、数据库等)以备以后研究之用。
这两个Provider就是根据这些需求开发的,它们分别负责记录系统中的运行日志与运行时异常,但是IsLine框架的AppLogProvider比Log4Net更加灵活、易用,使用这个模块的优点如下:
- 由Render组件来定义输出介质。正如名字所示,这些组件把它们附加到日志组件上并将输出传递到输出流中,可以把一个Appender组件附加到多个日志对象上。
- 灵活控制日志等级,在部署系统后,通过等级控制,快捷切换是否记录某个业务块的信息。
- 通过日志缓存的设定,使系统集中资源的收集日志和异常信息,当达到一定的阀值后,高效的写入存储介质。
- 通过配置文件,可以快捷改变日志记录介质(文件、数据库),记录所用到的技术,不需更改程序文件,只需改变配置文件。
- 使用者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。
在这两个Provider中,有一个很重要的概念,就是“Render ”,Render是日志异常模块的配置节点,它决定了系统日志记录的目标、记录方式、路径等信息,这些信息可以通过配置得出,它可以是数据库、文本文件、XML文件,甚至是电视机,不过除了数据库、文件这些内置Render外,其他记录介质需要继承相关接口,然后扩展实现。
该Provider目前内置支持SQL SERVER、ORACLE、文本文件的记录方式,并可使用sql语句或存储过程为记录手段。
以下是一个Render实例
<OracleUsingSPRender>
<AppenderStyle>Oracle</AppenderStyle>
<AppenderType>StoredProcedure</AppenderType>
<AppenderInf>IsLine.Data.Configuration.OracleConnectString</AppenderInf>
<AppenderContent>SP_ADD_ILFWLOG.ADD_ILFWLOG</AppenderContent>
<LayoutInf></LayoutInf>
<Level>Debug</Level>
</OracleUsingSPRender>
<OracleUsingSPRender></OracleUsingSPRender>为一个Render节点,括号中的为Render的名字,默认的Render有:
OracleUsingSPRender:使用Oracle数据库的存储过程记录日志
OracleUsingTextRender:使用Oracle数据库的sql语句记录日志
SQLServerUsingSPRender:使用SQL SERVER数据库的存储过程记录日志
SQLServerUsingTextRender:使用SQL SERVER数据库的sql语句记录日志
FileRender:将日志记录至文本文件
MailRender:将日志发送给收件人
以上日志方式是IsLine FrameWork已经内置的支持日志记录方式,详细的具体配置方法可以参考作者的博客,这里就不给大家阐述了。
Render包括四部分:附加方式(AppenderStyle), 附加类型(AppenderType), 附加信息(AppenderInf)、 附加内容(AppenderContent)、等级(Level).
其中“AppenderStyle”指明了日志记录方式,可以是数据库、文件等,这是一个枚举类型;
“AppenderType”指明依附形式,可以是文件、存储过程名字等。
“AppenderContent”指明记录内容。当AppenderStyle指明使用数据库为日志记录介质、“AppenderType”指明存储过程时,“AppenderContent”为存储过程名字;“AppenderType”指明sql语句时,“AppenderContent”为具体sql语句。
“Level”表示记录的等级,该等级小于全局日志记录等级时,该日志实例将不工作;全局日志记录等级在web.config中配置,下面会有介绍。
“AppenderInf”表示记录路径或使用的扩展程序;
在ILFW框架里,通过设置配置文件,每个日志对象都被分配了一个日志优先级别,即Level节点中的值,同时配置文件中还有一个表示全局级别的键值串,当Level节点中的枚举值小于全局级别时,该日志对象将不会记录。级别大小关系为Off > Fatal > Error > Debug > Warn > Info > All,这些关系可以通过Level关键字进行配置,级别信息如下,在Web.config中进行全局级别配置:
<add key="IsLine.AppLog.Configuration.Level" value="Debug"/>
这样,大于等于Debug级别的Render将被记录。当Level级别设置为All时,此时全局级别最低,AppLogProvider将记录所有实例的信息;当Level级别设置为Off时,此时全局级别最高,AppLogProvider不会记录任何实例的信息。
● IsLine.AppLog.AppLogProvider命名空间:
该命名空间提供了上册逻辑将系统行为记录到介质的能力,上层业务通过对WriteLog()方法的调用,即可完成对当前断点行为的记录。
在调用该方法前,需要预先获得日志实体,并且将该实体做为参数传递给上述方法,日志实体中规范了记录内容,记录字段为标准的.Net 异常字段,分别与数据库或其他Appender对应,当AppLogProvider获得日志实体后,便会加载Render模块,对基本日志信息进行渲染。
Render通过对记录介质、依附方式、依附格式、报告等级等配置信息的加载,从而完成日志的写入工作。
程序调用AppLogProvider时,需要进行实例化,在实例化过程中指定使用哪个Render,不同的实例对应不同的配置信息,就可以对应不同的等级、记录介质,如下:
图 4.1 构造函数配置效果
如上图所示,使用前先实例化一个日志实例,实例化时有6中内置方式可以选择,我们刚配置了File节点信息,所以在这里选择“File”:
//定义日志实例
LogProvider lp = new LogProvider(Appenders.File)
//定义日志实体
LogEntity le = new LogEntity();
//给日志内容字段赋值
le.Exception="IsLine Test";
le.Message = "OK";
//将日志内容写入介质
lp.WriteLog(le);
这样就完成了日志写入过程,效果如下:
图 4.2 文档型日志格式
如日后希望更改日志写入属性,比如希望把该日志输出至Oracle,可以将“AppenderStyle”节点名称值设定为“Oracle“,并在其他节点中填写对应内容,这样“FileRender”Render就指向了Oracle介质,IsLine的Render模块会自动在内部渲染出一个Oracle承载器供使用,而代码不需做任何修改。甚至你还可以定义一个自定义日志Render,在new LogProvider时传入的参数为自定义节点的名称"YourName"。具体方法参见作者博客。
日志模块允许缓存方式,即系统将日志信息累计到一个阀值时,在批量写入存储介质,这样就增强了灵活性。AppLogProvider提供了多种方式来记录一个日志消息,可以在应用程序里创建多个AppLogProvider。
全局缓存,高于此缓存时才会被写入日志,例如定义缓存中日志条数大于2条,再触发写日志,可以在web.config中添加以下配置信息:
<add key="IsLine.AppLog.Configuration.BufferSize" value="2"/>
默认缓存策略是关闭的,只有当添加上面的代码后,缓存策略才会打开。
IsLine AppLogProvider是一个很好用的日志模块,灵活是它的特性。本讲主要说的日志操作,在下一讲,我们将来说一下异常处理。
本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2010/05/04/ilfw4.html,如需转载请自行联系原作者