diff --git a/Packages/X2LogDXE2.dpk b/Packages/X2LogDXE2.dpk index b47c37f..c9af3c9 100644 --- a/Packages/X2LogDXE2.dpk +++ b/Packages/X2LogDXE2.dpk @@ -50,7 +50,8 @@ contains X2Log.Details.Intf in '..\X2Log.Details.Intf.pas', X2Log.Details.Registry in '..\X2Log.Details.Registry.pas', X2Log.Util.Stream in '..\X2Log.Util.Stream.pas', - X2Log.Translations.Dutch in '..\X2Log.Translations.Dutch.pas'; + X2Log.Translations.Dutch in '..\X2Log.Translations.Dutch.pas', + X2Log.Decorator in '..\X2Log.Decorator.pas'; end. diff --git a/Packages/X2LogDXE2.dproj b/Packages/X2LogDXE2.dproj index 6248116..d8a66b3 100644 --- a/Packages/X2LogDXE2.dproj +++ b/Packages/X2LogDXE2.dproj @@ -107,6 +107,7 @@ + Base diff --git a/X2Log.Decorator.pas b/X2Log.Decorator.pas new file mode 100644 index 0000000..27c0151 --- /dev/null +++ b/X2Log.Decorator.pas @@ -0,0 +1,191 @@ +unit X2Log.Decorator; + +interface +uses + System.SysUtils, + + X2Log.Intf; + + +type + TX2LogCategoryDecorator = class(TInterfacedObject, IX2Log) + private + FCategoryName: string; + FDecoratedLog: IX2Log; + protected + function GetCategory(const ACategory: string = ''): string; + + property CategoryName: string read FCategoryName write FCategoryName; + property DecoratedLog: IX2Log read FDecoratedLog; + public + constructor Create(ADecoratedLog: IX2Log; const ACategory: string); + + { IX2LogBase } + procedure Log(ALevel: TX2LogLevel; const AMessage: string; const ACategory: string = ''; ADetails: IX2LogDetails = nil); overload; + procedure Log(ALevel: TX2LogLevel; ADateTime: TDateTime; const AMessage: string; const ACategory: string = ''; ADetails: IX2LogDetails = nil); overload; + + { IX2LogObservable } + procedure Attach(AObserver: IX2LogObserver); + procedure Detach(AObserver: IX2LogObserver); + + { IX2Log } + procedure SetExceptionStrategy(AStrategy: IX2LogExceptionStrategy); + + function Category(const ACategory: string): IX2Log; + + procedure Verbose(const AMessage: string; const ADetails: string = ''); + procedure VerboseEx(const AMessage: string; ADetails: IX2LogDetails = nil); + + procedure Info(const AMessage: string; const ADetails: string = ''); + procedure InfoEx(const AMessage: string; ADetails: IX2LogDetails = nil); + + procedure Warning(const AMessage: string; const ADetails: string = ''); + procedure WarningEx(const AMessage: string; ADetails: IX2LogDetails = nil); + + procedure Error(const AMessage: string; const ADetails: string = ''); + procedure ErrorEx(const AMessage: string; ADetails: IX2LogDetails = nil); + + procedure Exception(AException: Exception; const AMessage: string = ''); + procedure ExceptionEx(AException: Exception; const AMessage: string = ''; const ACategory: string = ''); + end; + + +implementation +uses + X2Log.Constants, + X2Log.Details.Default, + X2Log.Exception.Default; + + + +{ TX2LogCategoryDecorator } +constructor TX2LogCategoryDecorator.Create(ADecoratedLog: IX2Log; const ACategory: string); +begin + inherited Create; + + FDecoratedLog := ADecoratedLog; + FCategoryName := ACategory; +end; + + +procedure TX2LogCategoryDecorator.Log(ALevel: TX2LogLevel; const AMessage, ACategory: string; ADetails: IX2LogDetails); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(ALevel, AMessage, GetCategory(ACategory), ADetails); +end; + + +procedure TX2LogCategoryDecorator.Log(ALevel: TX2LogLevel; ADateTime: TDateTime; const AMessage, ACategory: string; ADetails: IX2LogDetails); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(ALevel, AMessage, GetCategory(ACategory), ADetails); +end; + + +procedure TX2LogCategoryDecorator.Attach(AObserver: IX2LogObserver); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Attach(AObserver); +end; + + +procedure TX2LogCategoryDecorator.Detach(AObserver: IX2LogObserver); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Detach(AObserver); +end; + + +procedure TX2LogCategoryDecorator.SetExceptionStrategy(AStrategy: IX2LogExceptionStrategy); +begin + if Assigned(DecoratedLog) then + DecoratedLog.SetExceptionStrategy(AStrategy); +end; + + +function TX2LogCategoryDecorator.Category(const ACategory: string): IX2Log; +begin + if Assigned(DecoratedLog) then + Result := Self.Create(DecoratedLog, GetCategory(ACategory)); +end; + + +procedure TX2LogCategoryDecorator.Verbose(const AMessage, ADetails: string); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Verbose, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); +end; + + +procedure TX2LogCategoryDecorator.VerboseEx(const AMessage: string; ADetails: IX2LogDetails); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Verbose, AMessage, CategoryName, ADetails); +end; + + +procedure TX2LogCategoryDecorator.Info(const AMessage, ADetails: string); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Info, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); +end; + + +procedure TX2LogCategoryDecorator.InfoEx(const AMessage: string; ADetails: IX2LogDetails); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Info, AMessage, CategoryName, ADetails); +end; + + +procedure TX2LogCategoryDecorator.Warning(const AMessage, ADetails: string); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Warning, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); +end; + + +procedure TX2LogCategoryDecorator.WarningEx(const AMessage: string; ADetails: IX2LogDetails); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Warning, AMessage, CategoryName, ADetails); +end; + + +procedure TX2LogCategoryDecorator.Error(const AMessage, ADetails: string); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Error, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); +end; + + +procedure TX2LogCategoryDecorator.ErrorEx(const AMessage: string; ADetails: IX2LogDetails); +begin + if Assigned(DecoratedLog) then + DecoratedLog.Log(TX2LogLevel.Error, AMessage, CategoryName, ADetails); +end; + + +procedure TX2LogCategoryDecorator.Exception(AException: Exception; const AMessage: string); +begin + if Assigned(DecoratedLog) then + DecoratedLog.ExceptionEx(AException, AMessage, CategoryName); +end; + + +procedure TX2LogCategoryDecorator.ExceptionEx(AException: Exception; const AMessage, ACategory: string); +begin + if Assigned(DecoratedLog) then + DecoratedLog.ExceptionEx(AException, AMessage, GetCategory(ACategory)); +end; + + +function TX2LogCategoryDecorator.GetCategory(const ACategory: string): string; +begin + Result := CategoryName; + + if Length(ACategory) > 0 then + Result := Result + LogCategorySeparator + ACategory; +end; + +end. diff --git a/X2Log.Intf.pas b/X2Log.Intf.pas index 3bdb134..3f51543 100644 --- a/X2Log.Intf.pas +++ b/X2Log.Intf.pas @@ -90,6 +90,7 @@ type procedure ErrorEx(const AMessage: string; ADetails: IX2LogDetails = nil); procedure Exception(AException: Exception; const AMessage: string = ''); + procedure ExceptionEx(AException: Exception; const AMessage: string = ''; const ACategory: string = ''); end; diff --git a/X2Log.pas b/X2Log.pas index ad24815..89a2eaf 100644 --- a/X2Log.pas +++ b/X2Log.pas @@ -11,19 +11,10 @@ uses type - IX2LogExceptionCategory = interface - ['{ED076237-65AA-4B0C-8A25-4A6B28D2F0CB}'] - procedure Exception(AException: Exception; const AMessage: string = ''; const ACategory: string = ''); - end; - - - TX2Log = class(TX2LogBaseClient, IX2Log, IX2LogExceptionCategory) + TX2Log = class(TX2LogBaseClient, IX2Log) private FExceptionStrategy: IX2LogExceptionStrategy; protected - { IX2LogExceptionCategory } - procedure Exception(AException: Exception; const AMessage: string = ''; const ACategory: string = ''); overload; virtual; - property ExceptionStrategy: IX2LogExceptionStrategy read FExceptionStrategy; public constructor Create; @@ -45,55 +36,15 @@ type procedure Error(const AMessage: string; const ADetails: string = ''); procedure ErrorEx(const AMessage: string; ADetails: IX2LogDetails = nil); - procedure Exception(AException: Exception; const AMessage: string = ''); overload; - end; - - - TX2LogCategoryDecorator = class(TInterfacedObject, IX2Log) - private - FCategoryName: string; - FDecoratedLog: IX2Log; - protected - function GetCategory(const ACategory: string = ''): string; - - property CategoryName: string read FCategoryName write FCategoryName; - property DecoratedLog: IX2Log read FDecoratedLog; - public - constructor Create(ADecoratedLog: IX2Log; const ACategory: string); - - { IX2LogBase } - procedure Log(ALevel: TX2LogLevel; const AMessage: string; const ACategory: string = ''; ADetails: IX2LogDetails = nil); overload; - procedure Log(ALevel: TX2LogLevel; ADateTime: TDateTime; const AMessage: string; const ACategory: string = ''; ADetails: IX2LogDetails = nil); overload; - - { IX2LogObservable } - procedure Attach(AObserver: IX2LogObserver); - procedure Detach(AObserver: IX2LogObserver); - - { IX2Log } - procedure SetExceptionStrategy(AStrategy: IX2LogExceptionStrategy); - - function Category(const ACategory: string): IX2Log; - - procedure Verbose(const AMessage: string; const ADetails: string = ''); - procedure VerboseEx(const AMessage: string; ADetails: IX2LogDetails = nil); - - procedure Info(const AMessage: string; const ADetails: string = ''); - procedure InfoEx(const AMessage: string; ADetails: IX2LogDetails = nil); - - procedure Warning(const AMessage: string; const ADetails: string = ''); - procedure WarningEx(const AMessage: string; ADetails: IX2LogDetails = nil); - - procedure Error(const AMessage: string; const ADetails: string = ''); - procedure ErrorEx(const AMessage: string; ADetails: IX2LogDetails = nil); - procedure Exception(AException: Exception; const AMessage: string = ''); + procedure ExceptionEx(AException: Exception; const AMessage: string = ''; const ACategory: string = ''); end; - implementation uses X2Log.Constants, + X2Log.Decorator, X2Log.Details.Default, X2Log.Exception.Default; @@ -172,11 +123,11 @@ end; procedure TX2Log.Exception(AException: Exception; const AMessage: string); begin - Exception(AException, AMessage, LogCategoryDefault); + ExceptionEx(AException, AMessage, LogCategoryDefault); end; -procedure TX2Log.Exception(AException: Exception; const AMessage, ACategory: string); +procedure TX2Log.ExceptionEx(AException: Exception; const AMessage, ACategory: string); var msg: string; details: IX2LogDetails; @@ -186,139 +137,7 @@ begin details := nil; ExceptionStrategy.Execute(AException, msg, details); - Log(TX2LogLevel.Error, msg, LogCategoryDefault, details); -end; - - -{ TX2LogCategoryDecorator } -constructor TX2LogCategoryDecorator.Create(ADecoratedLog: IX2Log; const ACategory: string); -begin - inherited Create; - - FDecoratedLog := ADecoratedLog; - FCategoryName := ACategory; -end; - - -procedure TX2LogCategoryDecorator.Log(ALevel: TX2LogLevel; const AMessage, ACategory: string; ADetails: IX2LogDetails); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(ALevel, AMessage, GetCategory(ACategory), ADetails); -end; - - -procedure TX2LogCategoryDecorator.Log(ALevel: TX2LogLevel; ADateTime: TDateTime; const AMessage, ACategory: string; ADetails: IX2LogDetails); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(ALevel, AMessage, GetCategory(ACategory), ADetails); -end; - - -procedure TX2LogCategoryDecorator.Attach(AObserver: IX2LogObserver); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Attach(AObserver); -end; - - -procedure TX2LogCategoryDecorator.Detach(AObserver: IX2LogObserver); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Detach(AObserver); -end; - - -procedure TX2LogCategoryDecorator.SetExceptionStrategy(AStrategy: IX2LogExceptionStrategy); -begin - if Assigned(DecoratedLog) then - DecoratedLog.SetExceptionStrategy(AStrategy); -end; - - -function TX2LogCategoryDecorator.Category(const ACategory: string): IX2Log; -begin - if Assigned(DecoratedLog) then - Result := Self.Create(DecoratedLog, GetCategory(ACategory)); -end; - - -procedure TX2LogCategoryDecorator.Verbose(const AMessage, ADetails: string); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Verbose, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); -end; - - -procedure TX2LogCategoryDecorator.VerboseEx(const AMessage: string; ADetails: IX2LogDetails); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Verbose, AMessage, CategoryName, ADetails); -end; - - -procedure TX2LogCategoryDecorator.Info(const AMessage, ADetails: string); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Info, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); -end; - - -procedure TX2LogCategoryDecorator.InfoEx(const AMessage: string; ADetails: IX2LogDetails); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Info, AMessage, CategoryName, ADetails); -end; - - -procedure TX2LogCategoryDecorator.Warning(const AMessage, ADetails: string); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Warning, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); -end; - - -procedure TX2LogCategoryDecorator.WarningEx(const AMessage: string; ADetails: IX2LogDetails); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Warning, AMessage, CategoryName, ADetails); -end; - - -procedure TX2LogCategoryDecorator.Error(const AMessage, ADetails: string); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Error, AMessage, CategoryName, TX2LogStringDetails.CreateIfNotEmpty(ADetails)); -end; - - -procedure TX2LogCategoryDecorator.ErrorEx(const AMessage: string; ADetails: IX2LogDetails); -begin - if Assigned(DecoratedLog) then - DecoratedLog.Log(TX2LogLevel.Error, AMessage, CategoryName, ADetails); -end; - - -procedure TX2LogCategoryDecorator.Exception(AException: Exception; const AMessage: string); -var - exceptionCategory: IX2LogExceptionCategory; - -begin - if not Assigned(DecoratedLog) then - exit; - - if Supports(DecoratedLog, IX2LogExceptionCategory, exceptionCategory) then - exceptionCategory.Exception(AException, AMessage, CategoryName) - else - DecoratedLog.Log(TX2LogLevel.Error, AMessage, CategoryName); -end; - - -function TX2LogCategoryDecorator.GetCategory(const ACategory: string): string; -begin - Result := CategoryName; - - if Length(ACategory) > 0 then - Result := Result + LogCategorySeparator + ACategory; + Log(TX2LogLevel.Error, msg, ACategory, details); end; end.