微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

时间:2021-09-13 05:03:10

 

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

  上图是一个日志模块的基本配置,本节我们就来讲述一些关于他的内容和代码示例。

  默认情况下,在web.config文件中的配置信息是明文的,你可以用.NET自带的加密解密保护机制将配置信息加密,也可以用企业库提供的保护机制。在配置工具中就可以选择,如下图所示

  

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

 

     无论你选择那一种,保存之后,你打开web.config文件,就会发现原来明文的日志配置节,变成了下面的加密格式(不用开发者操心解密的事情,用的时候自动解密)。

 

  

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

 

 

      企业库的日志模块可以将日志信息以多种形式来记录,系统事件、文本文件、电子邮件、事件查看器、数据库、消息队列,xml格式等,如下图所示建立日志记录的形式。

       微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

      如上图所示,在Trace Listener上点击右键,选择New,然后会出来很多的选项,每一个代表一种记录的形式,也可以说是记录的目的,位置。

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

      上图是数据库记录日志,需要和数据访模块配合使用,需要一个DatabaseInstance,然后要有两个存储过程,一个是AddCategoryStoreProcedureName,添加分类的存储过程名称;一个是WriteLogStoreProcedureName,往数据库写日志的存储过程名称。

      记录在数据库中的好处就是方便统计、查询,可以借助数据库T-SQL能力进行日志的统计和查询。

      可以用企业库的示例数据库来实验一下数据库记录日志,下图所示就是安装目录的示例sql数据库,在查询分析器中运行一下,建立数据库、表和存储过程

     

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

      示例数据库如下图

 

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

      trace listener、category和数据库访问模块配置如下图

 

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

        代码还是最后的示例代码,现在是Trace组又多了一个日志记录的位置,就是刚才配置的数据库。运行代码之后,打开数据库就会发现多了一些记录。

 

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

      上图是写文件日志,格式为文本文件,可以设置目录,如上图所示为logs目录下的trace.log文件,filename属性支持一些系统变量,例如:%WINDIR%,%TEMP%,%USERPROFILE%。

      随着系统的使用,日志文件会越来越大,这样的话,一个文件一天之后都会变成几百MB,打都打不开了,而且如果我想删除三个月之前的,怎么办呢?好像没有办法,只有打开文件,进行删除,这也太麻烦了吧。还有就是文件名称,我想在前面添加一个目录,目录是当前日期,例如:2009-9-9,可是好像系统变量%DATE%,在这里不好用,不知道是我用错了,还是怎么回事,希望知道的同学指点一二。

 

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

      点击Template后面的。。。就可以打开文件的模板设置,就是文件记录的内容,可以随自己的需要进行调整。

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

      上面的文本文件记录日志,会碰到两个问题:

      1)随着系统的使用文件越来越大,最好可以每天一个文件,或者每小时一个文件,或者是每10MB一个文件

      2)文件最好自动的放在当天的文件夹下面,然后每个月一个文件夹,这样的话也好处理固定时期的日志,进行删除获取转存到其他地方都可以了。

      第一个问题可以用Roll Flat File Trace Listener来实现,如上图所示,可以设置循环的Interval,RollInterval就是周期,里面有分钟、小时、天、月、年、每天晚上等。RollFileExistsBehavior就是发现同名文件如何处理,可以覆盖或者自增。RollSizeKB就是设置文件的大小,超过大小之后自动创建一个文件,将旧的日志移到创建文件中。

      第二个问题,我也没有找到办法,因为我想是设置filename为%DATE%\trace.log,可是没有起到作用。可以设置为%WINDIR%\trace.log,就会在C:\WINDOWS目录下创建日志文件trace.log。不知道是不是我使用的不对,还是本来就不支持呢?希望知道的同学指点一二,先谢谢了!!!

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

      有时候我们会觉得记录成xml格式比较好,也可以利用C#进行解析,显示,查询,查看起来也还算方便。但是我遇到一个问题,就是xml trace listener的filename属性不支持相对路径, 前面的设置为trace.log,就会在应用的根目录创建trace.log文件,可是这里如果填上trace.xml,就什么都没有,也不报错,只能用绝对路径f:\mydocument\trace.xml,这样才会在f:\mydocument目录创建trace.xml文件。如上图所示,就可以实现。不知道是我使用的问题,还是本来就不支持呢?也希望知道的同学指点一二,先谢谢了!!!!!

 

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

 

      如上图所示,Category 的作用就好像是将前面设置的trace listener进行分组,就是同时使用一种或者多种日志记录方式,记录数据库的同时可以记录文本文件。就是将记录方式进行分组。

微软企业库4.1学习笔记(三十七)日志模块 在应用中使用日志模块

     

      上图的Trace组就包括了四种日志记录形式。

 

      代码示例

 

  private   void  RecordSelectedCategories()
        {
            
                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,

     

log.Categories  =  Categories;

 

 

       记录日志的时候,就会以Categories中设置的组包含日志类型进行记录。