123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 2003 by the Free Pascal development team
- Cross-platform event logging facility.
-
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$mode objfpc}
- {$h+}
- unit eventlog;
- interface
- uses SysUtils,Classes;
- Type
- TEventLog = Class;
- TEventType = (etCustom,etInfo,etWarning,etError,etDebug);
- TLogType = (ltSystem,ltFile);
- TLogCodeEvent = Procedure (Sender : TObject; Var Code : DWord) of Object;
- TLogCategoryEvent = Procedure (Sender : TObject; Var Code : Word) of Object;
-
- TEventLog = Class(TComponent)
- Private
- FEventIDOffset : DWord;
- FLogHandle : Pointer;
- FStream : TFileStream;
- FActive: Boolean;
- FIdentification: String;
- FDefaultEventType: TEventType;
- FLogtype: TLogType;
- FFileName: String;
- FTimeStampFormat: String;
- FCustomLogType: Word;
- FOnGetCustomCategory : TLogCategoryEvent;
- FOnGetCustomEventID : TLogCodeEvent;
- FOnGetCustomEvent : TLogCodeEvent;
- procedure SetActive(const Value: Boolean);
- procedure SetIdentification(const Value: String);
- procedure SetlogType(const Value: TLogType);
- procedure ActivateLog;
- procedure DeActivateLog;
- procedure ActivateFileLog;
- procedure SetFileName(const Value: String);
- procedure ActivateSystemLog;
- function DefaultFileName: String;
- procedure WriteFileLog(EventType : TEventType; Msg: String);
- procedure WriteSystemLog(EventType: TEventType; Msg: String);
- procedure DeActivateFileLog;
- procedure DeActivateSystemLog;
- procedure CheckIdentification;
- Procedure DoGetCustomEventID(Var Code : DWord);
- Procedure DoGetCustomEventCategory(Var Code : Word);
- Procedure DoGetCustomEvent(Var Code : DWord);
- Protected
- Procedure CheckInactive;
- Procedure EnsureActive;
- function MapTypeToEvent(EventType: TEventType): DWord;
- Function MapTypeToCategory(EventType : TEventType) : Word;
- Function MapTypeToEventID(EventType : TEventType) : DWord;
- Public
- Destructor Destroy; override;
- Function EventTypeToString(E : TEventType) : String;
- Function RegisterMessageFile(AFileName : String) : Boolean; virtual;
- Procedure Log (EventType : TEventType; Msg : String); {$ifndef fpc }Overload;{$endif}
- Procedure Log (EventType : TEventType; Fmt : String; Args : Array of const); {$ifndef fpc }Overload;{$endif}
- Procedure Log (Msg : String); {$ifndef fpc }Overload;{$endif}
- Procedure Log (Fmt : String; Args : Array of const); {$ifndef fpc }Overload;{$endif}
- Procedure Warning (Msg : String); {$ifndef fpc }Overload;{$endif}
- Procedure Warning (Fmt : String; Args : Array of const); {$ifndef fpc }Overload;{$endif}
- Procedure Error (Msg : String); {$ifndef fpc }Overload;{$endif}
- Procedure Error (Fmt : String; Args : Array of const); {$ifndef fpc }Overload;{$endif}
- Procedure Debug (Msg : String); {$ifndef fpc }Overload;{$endif}
- Procedure Debug (Fmt : String; Args : Array of const); {$ifndef fpc }Overload;{$endif}
- Procedure Info (Msg : String); {$ifndef fpc }Overload;{$endif}
- Procedure Info (Fmt : String; Args : Array of const); {$ifndef fpc }Overload;{$endif}
- Published
- Property Identification : String Read FIdentification Write SetIdentification;
- Property LogType : TLogType Read Flogtype Write SetlogType;
- Property Active : Boolean Read FActive write SetActive;
- Property DefaultEventType : TEventType Read FDEfaultEventType Write FDefaultEventType;
- Property FileName : String Read FFileName Write SetFileName;
- Property TimeStampFormat : String Read FTimeStampFormat Write FTimeStampFormat;
- Property CustomLogType : Word Read FCustomLogType Write FCustomLogType;
- Property EventIDOffset : DWord Read FEventIDOffset Write FEventIDOffset;
- Property OnGetCustomCategory : TLogCategoryEvent Read FOnGetCustomCategory Write FOnGetCustomCategory;
- Property OnGetCustomEventID : TLogCodeEvent Read FOnGetCustomEventID Write FOnGetCustomEventID;
- Property OnGetCustomEvent : TLogCodeEvent Read FOnGetCustomEvent Write FOnGetCustomEvent;
- End;
- ELogError = Class(Exception);
- Resourcestring
- SLogInfo = 'Info';
- SLogWarning = 'Warning';
- SLogError = 'Error';
- SLogDebug = 'Debug';
- SLogCustom = 'Custom (%d)';
- implementation
- {$i eventlog.inc}
- { TEventLog }
- Resourcestring
- SErrOperationNotAllowed = 'Operation not allowed when eventlog is active.';
- procedure TEventLog.CheckInactive;
- begin
- If Active then
- Raise ELogError.Create(SErrOperationNotAllowed);
- end;
- procedure TEventLog.Debug(Fmt: String; Args: array of const);
- begin
- Debug(Format(Fmt,Args));
- end;
- procedure TEventLog.Debug(Msg: String);
- begin
- Log(etDebug,Msg);
- end;
- procedure TEventLog.EnsureActive;
- begin
- If Not Active then
- Active:=True;
- end;
- procedure TEventLog.Error(Fmt: String; Args: array of const);
- begin
- Error(Format(Fmt,Args));
- end;
- procedure TEventLog.Error(Msg: String);
- begin
- Log(etError,Msg);
- end;
- procedure TEventLog.Info(Fmt: String; Args: array of const);
- begin
- Info(Format(Fmt,Args));
- end;
- procedure TEventLog.Info(Msg: String);
- begin
- Log(etInfo,Msg);
- end;
- procedure TEventLog.Log(Msg: String);
- begin
- Log(DefaultEventType,msg);
- end;
- procedure TEventLog.Log(EventType: TEventType; Fmt: String;
- Args: array of const);
- begin
- Log(EventType,Format(Fmt,Args));
- end;
- procedure TEventLog.Log(EventType: TEventType; Msg: String);
- begin
- EnsureActive;
- Case FlogType of
- ltFile : WriteFileLog(EventType,Msg);
- ltSystem : WriteSystemLog(EventType,Msg);
- end;
- end;
- procedure TEventLog.WriteFileLog(EventType : TEventType; Msg : String);
- Var
- S,TS,T : String;
- begin
- If FTimeStampFormat='' then
- FTimeStampFormat:='yyyy-mm-dd hh:nn:ss.zzz';
- TS:=FormatDateTime(FTimeStampFormat,Now);
- T:=EventTypeToString(EventType);
- S:=Format('%s [%s %s] %s%s',[Identification,TS,T,Msg,LineEnding]);
- FStream.Write(S[1],Length(S));
- end;
- procedure TEventLog.Log(Fmt: String; Args: array of const);
- begin
- Log(Format(Fmt,Args));
- end;
- procedure TEventLog.SetActive(const Value: Boolean);
- begin
- If Value<>FActive then
- begin
- If Value then
- ActivateLog
- else
- DeActivateLog;
- FActive:=Value;
- end;
- end;
- Procedure TEventLog.ActivateLog;
- begin
- Case FLogType of
- ltFile : ActivateFileLog;
- ltSystem : ActivateSystemLog;
- end;
- end;
- Procedure TEventLog.DeActivateLog;
- begin
- Case FLogType of
- ltFile : DeActivateFileLog;
- ltSystem : DeActivateSystemLog;
- end;
- end;
- Procedure TEventLog.ActivateFileLog;
- begin
- If (FFileName='') then
- FFileName:=DefaultFileName;
- // This will raise an exception if the file cannot be opened for writing !
- FStream:=TFileStream.Create(FFileName,fmCreate or fmShareDenyWrite);
- end;
- Procedure TEventLog.DeActivateFileLog;
- begin
- FStream.Free;
- FStream:=Nil;
- end;
- procedure TEventLog.SetIdentification(const Value: String);
- begin
- FIdentification := Value;
- end;
- procedure TEventLog.SetlogType(const Value: TLogType);
- begin
- CheckInactive;
- Flogtype := Value;
- end;
- procedure TEventLog.Warning(Fmt: String; Args: array of const);
- begin
- Warning(Format(Fmt,Args));
- end;
- procedure TEventLog.Warning(Msg: String);
- begin
- Log(etWarning,Msg);
- end;
- procedure TEventLog.SetFileName(const Value: String);
- begin
- CheckInactive;
- FFileName := Value;
- end;
- Procedure TEventLog.CheckIdentification;
- begin
- If (Identification='') then
- Identification:=ChangeFileExt(ExtractFileName(Paramstr(0)),'');
- end;
- Function TEventLog.EventTypeToString(E : TEventType) : String;
- begin
- Case E of
- etInfo : Result:=SLogInfo;
- etWarning : Result:=SLogWarning;
- etError : Result:=SLogError;
- etDebug : Result:=SLogDebug;
- etCustom : Result:=Format(SLogCustom,[CustomLogType]);
- end;
- end;
- Procedure TEventLog.DoGetCustomEventID(Var Code : DWord);
- begin
- If Assigned(FOnGetCustomEventID) then
- FOnGetCustomEventID(Self,Code);
- end;
- Procedure TEventLog.DoGetCustomEventCategory(Var Code : Word);
- begin
- If Assigned(FOnGetCustomCategory) then
- FOnGetCustomCategory(Self,Code);
- end;
- Procedure TEventLog.DoGetCustomEvent(Var Code : DWord);
- begin
- If Assigned(FOnGetCustomEvent) then
- FOnGetCustomEvent(Self,Code);
- end;
- destructor TEventLog.Destroy;
- begin
- Active:=False;
- inherited;
- end;
- end.
- {
- $Log$
- Revision 1.2 2003-03-25 21:04:48 michael
- + Added support for custom log event type
- Revision 1.1 2003/02/19 20:25:16 michael
- + Added event log
- }
|