上图是一个日志模块的基本配置,本节我们就来讲述一些关于他的内容和代码示例。
默认情况下,在web.config文件中的配置信息是明文的,你可以用.NET自带的加密解密保护机制将配置信息加密,也可以用企业库提供的保护机制。在配置工具中就可以选择,如下图所示
无论你选择那一种,保存之后,你打开web.config文件,就会发现原来明文的日志配置节,变成了下面的加密格式(不用开发者操心解密的事情,用的时候自动解密)。
企业库的日志模块可以将日志信息以多种形式来记录,系统事件、文本文件、电子邮件、事件查看器、数据库、消息队列,xml格式等,如下图所示建立日志记录的形式。
如上图所示,在Trace Listener上点击右键,选择New,然后会出来很多的选项,每一个代表一种记录的形式,也可以说是记录的目的,位置。
上图是数据库记录日志,需要和数据访模块配合使用,需要一个DatabaseInstance,然后要有两个存储过程,一个是AddCategoryStoreProcedureName,添加分类的存储过程名称;一个是WriteLogStoreProcedureName,往数据库写日志的存储过程名称。
记录在数据库中的好处就是方便统计、查询,可以借助数据库T-SQL能力进行日志的统计和查询。
可以用企业库的示例数据库来实验一下数据库记录日志,下图所示就是安装目录的示例sql数据库,在查询分析器中运行一下,建立数据库、表和存储过程
示例数据库如下图
trace listener、category和数据库访问模块配置如下图
代码还是最后的示例代码,现在是Trace组又多了一个日志记录的位置,就是刚才配置的数据库。运行代码之后,打开数据库就会发现多了一些记录。
上图是写文件日志,格式为文本文件,可以设置目录,如上图所示为logs目录下的trace.log文件,filename属性支持一些系统变量,例如:%WINDIR%,%TEMP%,%USERPROFILE%。
随着系统的使用,日志文件会越来越大,这样的话,一个文件一天之后都会变成几百MB,打都打不开了,而且如果我想删除三个月之前的,怎么办呢?好像没有办法,只有打开文件,进行删除,这也太麻烦了吧。还有就是文件名称,我想在前面添加一个目录,目录是当前日期,例如:2009-9-9,可是好像系统变量%DATE%,在这里不好用,不知道是我用错了,还是怎么回事,希望知道的同学指点一二。
点击Template后面的。。。就可以打开文件的模板设置,就是文件记录的内容,可以随自己的需要进行调整。
上面的文本文件记录日志,会碰到两个问题:
1)随着系统的使用文件越来越大,最好可以每天一个文件,或者每小时一个文件,或者是每10MB一个文件
2)文件最好自动的放在当天的文件夹下面,然后每个月一个文件夹,这样的话也好处理固定时期的日志,进行删除获取转存到其他地方都可以了。
第一个问题可以用Roll Flat File Trace Listener来实现,如上图所示,可以设置循环的Interval,RollInterval就是周期,里面有分钟、小时、天、月、年、每天晚上等。RollFileExistsBehavior就是发现同名文件如何处理,可以覆盖或者自增。RollSizeKB就是设置文件的大小,超过大小之后自动创建一个文件,将旧的日志移到创建文件中。
第二个问题,我也没有找到办法,因为我想是设置filename为%DATE%\trace.log,可是没有起到作用。可以设置为%WINDIR%\trace.log,就会在C:\WINDOWS目录下创建日志文件trace.log。不知道是不是我使用的不对,还是本来就不支持呢?希望知道的同学指点一二,先谢谢了!!!
有时候我们会觉得记录成xml格式比较好,也可以利用C#进行解析,显示,查询,查看起来也还算方便。但是我遇到一个问题,就是xml trace listener的filename属性不支持相对路径, 前面的设置为trace.log,就会在应用的根目录创建trace.log文件,可是这里如果填上trace.xml,就什么都没有,也不报错,只能用绝对路径f:\mydocument\trace.xml,这样才会在f:\mydocument目录创建trace.xml文件。如上图所示,就可以实现。不知道是我使用的问题,还是本来就不支持呢?也希望知道的同学指点一二,先谢谢了!!!!!
如上图所示,Category 的作用就好像是将前面设置的trace listener进行分组,就是同时使用一种或者多种日志记录方式,记录数据库的同时可以记录文本文件。就是将记录方式进行分组。
上图的Trace组就包括了四种日志记录形式。
代码示例
{
categories.Add( " Trace " );
}
protected void Button1_Click( object sender, EventArgs e)
{
RecordSelectedCategories();
LogEntry log = new LogEntry();
log.EventId = 100 ;
log.Priority = 3 ;
log.Message = " information message " ;
log.Categories = Categories;
Dic.Add( " 1 " , " <log><id>1</id><name>shiwenbin</name></log> " );
Dic.Add( " 2 " , 2 );
log.ExtendedProperties = Dic;
Logger.Write(log );
}
private IDictionary < string , object > Dic = new Dictionary < string , object > ();
[NonSerialized]
private ICollection < string > categories = new List < string > ( 0 );
[IgnoreMember]
public ICollection < string > Categories
{
get { return categories; }
set { this .categories = value; }
}
首先新建一个LogEntry,设置它的属性,设置日志记录使用的组Category为Trace,
记录日志的时候,就会以Categories中设置的组包含日志类型进行记录。