一个简单Tracer类,用来为应用写入跟踪

2016-02-19 12:37 5 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的一个简单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:stringof 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.

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  ===================测试代码==========================
  {******************************************************************************}
  {                                                                              }
  {          测试名称:                                                          }
  {          作    者:                                                          }
  {          版    本:                                                          }
  {          说    明:                                                          }
  {          备    注:                                                          }
  {                                                                              }
  {******************************************************************************}
  
  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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1601330.html

延伸阅读
标签: Web开发
基本用法: 代码如下: var ajax = new AjaxObj(url); ajax.addListener(200, function(r){ alert(r); }); ajax.send(); 也可以连续调用: 代码如下: var ajax = new AjaxObj(url).addListener(200, function(r){ alert(r); }).send(); 另外还支持自定义的POST或GET方式请求,以及监视不同的HTTP状态码,自己看代码琢磨...
一个简单的链表模版类的实现 作者:Smoke 源代码下载     这是翻阅 《数据结构、算法与应用—— C++语言描述》 以及在网上得到的一些资料后写出来的。起因是在项目中要用到一个链表,但我做一个简单的链表在C++中用的时候跟C差别很多,比如赋值运算(编...
摘要 当一些应用程序崩溃时,它们往往向用户提供一个机会来提交关于该错误的信息。该信息能够帮助开发者追踪并修正错误。本文将向你展示如何在你的JavaScript/AJAX应用程序中实现这样的功能。 一、 引言 如果可以存取终端用户的计算机的话,那么终端用户的JavaScript错误就很容易调试。既然你不能实现这样的操作,那么你可以...
标签: Web开发
% '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '数据库操作类 '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '名称:Class_DBOperate '版本:0.2 '作者:qihangnet '更新:2005年6月14日 '作用:简化数据库操作的流程 '授权:免费使用 '%%%%%%%%%%%%%%%%%%%%%%%%%%...
标签: Web开发
用法:  new Ajax().Request(url,cmd,async,method,postString,title)  参数:  url: 请求页面URL(必填)  cmd: 返回值处理函数(必填)  async: 是否异步 ,(ture|false), 默认true  method: 请求方式,(post|get), 默认get  postString: 请求方式为pos...

经验教程

537

收藏

91
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部