今天给大家分享的是由图老师小编精心为您推荐的一个简单Tracer类,用来为应用写入跟踪,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!
【 tulaoshi.com - 编程语言 】
  ===================类的代码=========================={*******************************************************} 
  {                                                       } 
  {       CodeMachine                                     } 
  {                                                       } 
  {       版权所有 (C) 2004 nil                           } 
  {                                                       } 
  {       2004-6-10                                       } 
  {                                                       } 
  {*******************************************************} 
  { 
      通常将TTracer的实例存放于application级的Session中,在使用时, 
      创建一个ITraceInfo,调用TTracer.Write(ITraceInfo)即可, 
  } 
  
  unit com.sunset.app.tracer; 
  
  interface 
  
  uses StrUtils,classes,SysUtils; 
  
  type 
  
  //============================================================================== 
  // 接口声明 
  //============================================================================== 
  
      //跟踪信息的接口 
      ITraceInfo = interface 
          function ToString: string; 
      end; 
      //输出目标的接口 
      IOutput = interface 
          procedure Write(const aInfo: ITraceInfo); //写入跟踪信息 
      end; 
  
  //============================================================================== 
  // 跟踪信息类 ,实现 ITraceInfo 
  //============================================================================== 
  
      //string形式的跟踪记录 
      TStringTI = class(TInterfacedObject, ITraceInfo) 
      private 
          FData: string; 
      public 
          constructor Create(data: string); 
          function ToString: string; 
      end; 
  
  //============================================================================== 
  // 跟踪信息输出类,实现 IOutput 
  //============================================================================== 
  
      TFileLog = class(TInterfacedObject, IOutput) 
      private 
          FLogFile: string; 
      public 
          constructor Create(const FileName: string); 
          procedure Write(const aInfo: ITraceInfo); //写入跟踪信息 
      end; 
  
      TProcStr = procedure(const value:string) of Object; 
      TDatabaseLog = class(TInterfacedObject, IOutput) 
      private 
          FWriteProc :TProcStr; 
      public 
          constructor Create(WriteProc: TProcStr); 
          procedure Write(const aInfo: ITraceInfo); //写入跟踪信息 
      end; 
  
  //============================================================================== 
  // 跟踪工具 
  //============================================================================== 
  
  { TTracer } 
      //用来进行记录跟踪日志的类 
      TTracer = class(TObject) 
      private 
          FOutput: IOutput; //输出目标 
          procedure SetOutput(const Value: IOutput); 
      public 
          constructor Create; overload; 
          constructor Create(aOutput: IOutput); overload; 
          destructor Destroy; override; 
          property Output: IOutput read FOutput write SetOutput; 
          procedure Write(const aInfo: ITraceInfo); //写入跟踪信息 
      end; 
  
  implementation 
  
  { TTracer } 
  
  constructor TTracer.Create; 
  begin 
  
  end; 
  
  constructor TTracer.Create(aOutput: IOutput); 
  begin 
      FOutput := aOutput; 
  end; 
  
  destructor TTracer.Destroy; 
  begin 
      if FOutput  nil then FOutput := nil; 
      inherited; 
  end; 
  
  procedure TTracer.SetOutput(const Value: IOutput); 
  begin 
      FOutput := Value; 
  end; 
  
  procedure TTracer.Write(const aInfo: ITraceInfo); 
  begin 
      if FOutput = nil then raise Exception.CreateFmt('没有创建输出目标%s!!!', []); 
      FOutput.Write(aInfo); 
  end; 
  
  { TStringTI } 
  
  constructor TStringTI.Create(data: string); 
  begin 
      FData := Data; 
  end; 
  
  function TStringTI.ToString: string; 
  begin 
      Result := FData; 
  end; 
  
  { TStringLog } 
  
  constructor TFileLog.Create(const FileName: string); 
  begin 
      FLogFile := FileName; 
  end; 
  
  procedure TFileLog.Write(const aInfo: ITraceInfo); 
  begin 
      if not FileExists(FLogFile) then FileClose(FileCreate(FLogFile)); 
      with TStringList.Create do 
      begin 
          try 
              LoadFromFile(FLogFile); 
              Add(aInfo.ToString); 
              SaveToFile(FLogFile); 
          finally 
              Free; 
          end; 
      end; 
  end; 
  
  { TDatabaseLog } 
  
  constructor TDatabaseLog.Create(WriteProc: TProcStr); 
  begin 
      FWriteProc := WriteProc; 
      if not Assigned(FWriteProc) then raise Exception.CreateFmt('没有传入正确的写入跟踪方法%s!!!', []); 
  end; 
  
  procedure TDatabaseLog.Write(const aInfo: ITraceInfo); 
  begin 
      FWriteProc(aInfo.ToString); 
  end; 
  
  end. 
  ===================测试代码==========================
  {******************************************************************************} 
  {                                                                              } 
  {          测试名称:                                                          } 
  {          作    者:                                                          } 
  {          版    本:                                                          } 
  {          说    明:                                                          } 
  {          备    注:                                                          } 
  {                                                                              } 
  {******************************************************************************} 
  
  unit test.com.sunset.app.tracer; 
  
  interface 
  
  uses 
    Windows, SysUtils, Classes, TestFramework, TestExtensions, 
    com.sunset.app.tracer; 
  
  type 
    TTest = class(TTestCase) 
    protected 
      procedure SetUp; override; 
      procedure TearDown; override; 
  
    published 
      procedure TestTracer; 
    end; 
  
  implementation 
  
  procedure TTest.Setup; 
  begin 
  
  end; 
  
  procedure TTest.TearDown; 
  begin 
  
  end; 
  
  procedure TTest.TestTracer; 
  var 
      tracer:TTracer; 
      aInfo:ITraceInfo; 
  const 
      testData ='adfadfdasf'; 
      testFile ='d:2.txt'; 
  begin 
      aInfo := TStringTI.Create(testData); 
      Tracer := TTracer.Create(TFileLog.Create(testfile)); 
      Tracer.Write(aInfo); 
      Tracer.Free; 
      aInfo := nil; 
      with TStringList.Create do 
      begin 
          LoadFromFile(testfile); 
          Check(Strings[Count -1] = testData); 
          Free; 
      end; 
  end; 
  
  initialization 
    TestFramework.RegisterTest(TTest.Suite); 
  
  end. 
  
一竿残照@金棣.net
来源:http://www.tulaoshi.com/n/20160219/1601330.html
看过《一个简单Tracer类,用来为应用写入跟踪》的人还看了以下文章 更多>>