ulogobserverwriter.pas

来自「FMA is a free1 powerful phone editing to」· PAS 代码 · 共 115 行

PAS
115
字号
unit uLogObserverWriter;

{
*******************************************************************************
* Descriptions: Class to Write the Log Directly to a File
* $Source: /cvsroot/fma/fma/uLogObserverWriter.pas,v $
* $Locker:  $
*
* Todo:
*
* Change Log:
* $Log: uLogObserverWriter.pas,v $
* Revision 1.2  2005/03/28 20:23:15  lordlarry
* Fixed it to be thread safe
*
* Revision 1.1  2005/03/28 18:51:57  lordlarry
* Added a parameter /Log which lets FMA write the log directly to disk
*
*
}

interface

uses
  Classes, uLogger, uLogObserver, uLogWriters, SyncObjs;

type
  TLogObserverWriter = class(TObject)
  private
    FLogObserver: TLogObserver;
    FFileName: String;
    FLogWriterEngine: ILogWriterEngine;
    FStream: TFileStream;
    FCriticalSection: TCriticalSection;
    procedure LogItemAdded(Sender: TObject; const LogItem: ILogItem);
    procedure SetFileName(const Value: String);
    procedure SetLogEnumeration(const Value: ILogEnumeration);
    function GetLogEnumeration: ILogEnumeration;
  public
    constructor Create;
    destructor Destroy; override;

    property LogEnumeration: ILogEnumeration read GetLogEnumeration write SetLogEnumeration;
    property LogWriterEngine: ILogWriterEngine read FLogWriterEngine write FLogWriterEngine;
    property FileName: String read FFileName write SetFileName;
  end;

implementation

uses
  SysUtils, Windows;

{ TLogObserverWriter }

constructor TLogObserverWriter.Create;
begin
  inherited;

  FCriticalSection := TCriticalSection.Create;

  FLogObserver := TLogObserver.Create(nil);
  FLogObserver.Synchronized := False;
  FLogObserver.OnLogItemAdded := LogItemAdded;
end;

destructor TLogObserverWriter.Destroy;
begin
  FLogObserver.Free;

  if Assigned(FStream) then
    FreeAndNil(FStream);

  FCriticalSection.Free;

  inherited;
end;

function TLogObserverWriter.GetLogEnumeration: ILogEnumeration;
begin
  Result := FLogObserver.LogEnumeration;
end;

procedure TLogObserverWriter.LogItemAdded(Sender: TObject; const LogItem: ILogItem);
begin
  if Assigned(FLogWriterEngine) then begin
    FCriticalSection.Acquire;
    try
      FLogWriterEngine.WriteItem(FStream, LogItem);

      FlushFileBuffers(FStream.Handle);
    finally
      FCriticalSection.Release;
    end;
  end;
end;

procedure TLogObserverWriter.SetFileName(const Value: String);
begin
  if FFileName <> Value then begin
    FFileName := Value;

    if Assigned(FStream) then
      FreeAndNil(FStream);

    FStream := TFileStream.Create(CreateFile(PChar(FFileName), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0));
  end;
end;

procedure TLogObserverWriter.SetLogEnumeration(const Value: ILogEnumeration);
begin
  FLogObserver.LogEnumeration := Value;
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?