Updated LoggerPro, improved Wizard, general code cleaning

This commit is contained in:
Daniele Teti 2022-08-13 00:21:00 +02:00
parent f8501a8db5
commit 821180ea75
633 changed files with 1204 additions and 32541 deletions

View File

@ -113,10 +113,10 @@ var
lMiddlewaresCode: String;
I: Integer;
begin
lMiddlewaresCode := '';
lMiddlewaresCode := sLineBreak;
for I := Low(FMiddlewares) to High(FMiddlewares) do
begin
lMiddlewaresCode := lMiddlewaresCode + 'FMVC.AddMiddleware(' + FMiddlewares[I] + ');' + sLineBreak;
lMiddlewaresCode := lMiddlewaresCode + ' ' + FMiddlewares[I] + sLineBreak;
end;
lJSONRPCCode := '';

View File

@ -46,6 +46,7 @@ resourcestring
sLineBreak +
'uses' + sLineBreak +
' System.SysUtils,' + sLineBreak +
' MVCFramework,' + sLineBreak +
' MVCFramework.Logger,' + sLineBreak +
' MVCFramework.Commons,' + sLineBreak +
' MVCFramework.Signal,' + sLineBreak +
@ -72,37 +73,11 @@ resourcestring
// ' LCmd: string;' + sLineBreak +
'begin' + sLineBreak +
' Writeln(''** DMVCFramework Server ** build '' + DMVCFRAMEWORK_VERSION);' + sLineBreak +
// ' LCmd := ''start'';' + sLineBreak +
// ' if ParamCount >= 1 then' + sLineBreak +
// ' LCmd := ParamStr(1);' + sLineBreak + sLineBreak +
// ' LCustomHandler := function(const Value: String; const Server: TIdHTTPWebBrokerBridge; out Handled: Boolean): THandleCommandResult' + sLineBreak +
// ' begin' + sLineBreak +
// ' Handled := False;' + sLineBreak +
// ' Result := THandleCommandResult.Unknown;' + sLineBreak +
// sLineBreak +
// ' // Write here your custom command for the REPL using the following form...' + sLineBreak +
// ' // ***' + sLineBreak +
// ' // Handled := False;' + sLineBreak +
// ' // if (Value = ''apiversion'') then' + sLineBreak +
// ' // begin' + sLineBreak +
// ' // REPLEmit(''Print my API version number'');' + sLineBreak +
// ' // Result := THandleCommandResult.Continue;' + sLineBreak +
// ' // Handled := True;' + sLineBreak +
// ' // end' + sLineBreak +
// ' // else if (Value = ''datetime'') then' + sLineBreak +
// ' // begin' + sLineBreak +
// ' // REPLEmit(DateTimeToStr(Now));' + sLineBreak +
// ' // Result := THandleCommandResult.Continue;' + sLineBreak +
// ' // Handled := True;' + sLineBreak +
// ' // end;' + sLineBreak +
// ' end;' + sLineBreak +
// sLineBreak +
' LServer := TIdHTTPWebBrokerBridge.Create(nil);' + sLineBreak +
' try' + sLineBreak +
' LServer.OnParseAuthentication := TMVCParseAuthentication.OnParseAuthentication;' + sLineBreak +
' LServer.DefaultPort := APort;' + sLineBreak +
' LServer.KeepAlive := True;' + sLineBreak +
sLineBreak +
' LServer.KeepAlive := True;' + sLineBreak + sLineBreak +
' { more info about MaxConnections' + sLineBreak +
' http://ww2.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=index.html }' + sLineBreak +
' LServer.MaxConnections := 0;' + sLineBreak +
@ -113,34 +88,11 @@ resourcestring
sLineBreak +
// ' WriteLn(''Write "quit" or "exit" to shutdown the server'');' + sLineBreak +
' LServer.Active := True;' + sLineBreak +
' WriteLn(''Listening on port '', APort);' + sLineBreak +
' WriteLn(''CTRL+C to shutdown the server'');' + sLineBreak +
' WaitForTerminationSignal; ' + sLineBreak +
// ' repeat' + sLineBreak +
// ' if LCmd.IsEmpty then' + sLineBreak +
// ' begin' + sLineBreak +
// ' Write(''-> '');' + sLineBreak +
// ' ReadLn(LCmd)' + sLineBreak +
// ' end;' + sLineBreak +
// ' try' + sLineBreak +
// ' case HandleCommand(LCmd.ToLower, LServer, LCustomHandler) of' + sLineBreak +
// ' THandleCommandResult.Continue:' + sLineBreak +
// ' begin' + sLineBreak +
// ' Continue;' + sLineBreak +
// ' end;' + sLineBreak +
// ' THandleCommandResult.Break:' + sLineBreak +
// ' begin' + sLineBreak +
// ' Break;' + sLineBreak +
// ' end;' + sLineBreak +
// ' THandleCommandResult.Unknown:' + sLineBreak +
// ' begin' + sLineBreak +
// ' REPLEmit(''Unknown command: '' + LCmd);' + sLineBreak +
// ' end;' + sLineBreak +
// ' end;' + sLineBreak +
// ' finally' + sLineBreak +
// ' LCmd := '''';' + sLineBreak +
// ' end;' + sLineBreak +
// ' until False;' + sLineBreak +
// '' + sLineBreak +
' EnterInShutdownState; ' + sLineBreak +
' LServer.Active := False; ' + sLineBreak +
' finally' + sLineBreak +
' LServer.Free;' + sLineBreak +
' end;' + sLineBreak +
@ -323,6 +275,9 @@ resourcestring
' System.IOUtils, ' + sLineBreak +
' MVCFramework.Commons, ' + sLineBreak +
' MVCFramework.Middleware.StaticFiles, ' + sLineBreak +
' MVCFramework.Middleware.Analytics, ' + sLineBreak +
' MVCFramework.Middleware.Trace, ' + sLineBreak +
' MVCFramework.Middleware.CORS, ' + sLineBreak +
' MVCFramework.Middleware.Compression;' + sLineBreak +
sLineBreak +
'procedure %1:s.WebModuleCreate(Sender: TObject);' + sLineBreak +
@ -361,15 +316,6 @@ resourcestring
' Config[TMVCConfigKey.MaxRequestSize] := IntToStr(TMVCConstants.DEFAULT_MAX_REQUEST_SIZE);' + sLineBreak +
' end);' + sLineBreak +
' FMVC.AddController(%3:s);' + sLineBreak + sLineBreak +
' // Enable the following middleware declaration if you want to' + sLineBreak +
' // serve static files from this dmvcframework service.' + sLineBreak +
' // The folder mapped as documentroot must exists!' + sLineBreak +
' // FMVC.AddMiddleware(TMVCStaticFilesMiddleware.Create( ' + sLineBreak +
' // ''/static'', ' + sLineBreak +
' // TPath.Combine(ExtractFilePath(GetModuleName(HInstance)), ''www'')) ' + sLineBreak +
' // ); ' + sLineBreak + sLineBreak +
' // To enable compression (deflate, gzip) just add this middleware as the last one ' + sLineBreak +
' FMVC.AddMiddleware(TMVCCompressionMiddleware.Create);' + sLineBreak +
' %4:s ' + sLineBreak +
' %5:s ' + sLineBreak +
'end;' + sLineBreak +

View File

@ -1,11 +1,10 @@
object frmDMVCNewProject: TfrmDMVCNewProject
Left = 0
Top = 0
Cursor = crHandPoint
BorderStyle = bsDialog
Caption = 'New DMVCFramework Project Wizard'
ClientHeight = 624
ClientWidth = 355
ClientHeight = 484
ClientWidth = 596
Color = clBtnFace
Constraints.MinHeight = 145
Constraints.MinWidth = 250
@ -17,39 +16,40 @@ object frmDMVCNewProject: TfrmDMVCNewProject
Position = poMainFormCenter
OnCreate = FormCreate
DesignSize = (
355
624)
596
484)
TextHeight = 13
object Shape1: TShape
Left = 0
Top = 0
Width = 355
Height = 126
Width = 596
Height = 121
Align = alTop
Pen.Color = clWhite
end
object lblWbModule: TLabel
Left = 24
Top = 172
Top = 167
Width = 114
Height = 13
Caption = 'WebModule Class Name'
end
object Label2: TLabel
Left = 24
Top = 222
Top = 214
Width = 55
Height = 13
Caption = 'Server Port'
end
object Image1: TImage
Left = 0
Top = 0
Width = 355
Left = 24
Top = -1
Width = 352
Height = 101
Cursor = crHandPoint
Hint = 'Go to the DelphiMVCFramework project'
Align = alTop
AutoSize = True
Center = True
Picture.Data = {
0954506E67496D61676589504E470D0A1A0A0000000D49484452000001600000
00650802000000FCB9AE1C000000097048597300002E2300002E230178A53F76
@ -375,19 +375,16 @@ object frmDMVCNewProject: TfrmDMVCNewProject
4F1140101111F11401041111114F1140101111F11401041111114FFD0F3B403E
DAAF5C25370000000049454E44AE426082}
OnClick = Image1Click
ExplicitWidth = 352
end
object lblFrameworkVersion: TLabel
Left = 89
Top = 83
Width = 261
Height = 13
Alignment = taRightJustify
AutoSize = False
Left = 24
Top = 97
Width = 106
Height = 16
Caption = 'X.X.X carbonara'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Height = -13
Font.Name = 'Tahoma'
Font.Style = [fsBold]
ParentFont = False
@ -397,19 +394,19 @@ object frmDMVCNewProject: TfrmDMVCNewProject
end
object lblBook: TLabel
AlignWithMargins = True
Left = 11
Top = 102
Width = 339
Height = 19
Left = 283
Top = 99
Width = 309
Height = 16
Cursor = crHandPoint
Hint = 'Go to DMVCFramework - the official guide'
Margins.Right = 10
Alignment = taRightJustify
Anchors = [akTop, akRight]
AutoSize = False
Caption = 'DelphiMVCFramework - the official guide'
Anchors = []
Caption = 'Go to "DelphiMVCFramework - the official guide"'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Height = -13
Font.Name = 'Tahoma'
Font.Style = [fsBold]
ParentFont = False
@ -419,35 +416,32 @@ object frmDMVCNewProject: TfrmDMVCNewProject
OnMouseLeave = lblBookMouseLeave
end
object btnOK: TButton
Left = 187
Top = 589
Left = 428
Top = 449
Width = 77
Height = 27
Anchors = [akRight, akBottom]
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 4
ExplicitTop = 604
TabOrder = 3
end
object btnCancel: TButton
Left = 270
Top = 589
Left = 511
Top = 449
Width = 77
Height = 27
Anchors = [akRight, akBottom]
Cancel = True
Caption = 'Cancel'
ModalResult = 2
TabOrder = 5
ExplicitTop = 604
TabOrder = 4
end
object chkAddToProjectGroup: TCheckBox
Left = 24
Top = 135
Width = 307
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Add to Existing Project Group'
Checked = True
State = cbChecked
@ -455,49 +449,37 @@ object frmDMVCNewProject: TfrmDMVCNewProject
end
object edtWebModuleName: TEdit
Left = 24
Top = 191
Width = 310
Top = 186
Width = 225
Height = 21
Anchors = [akLeft, akTop, akRight]
TabOrder = 1
end
object edtServerPort: TEdit
Left = 24
Top = 241
Top = 233
Width = 65
Height = 21
TabOrder = 3
TabOrder = 2
TextHint = '8080'
end
object chkAnalyticsMiddleware: TCheckBox
Left = 212
Top = 243
Width = 135
Height = 17
Anchors = [akTop, akRight]
Caption = 'Add analytics support'
TabOrder = 2
Visible = False
end
object Panel1: TPanel
Left = 0
Top = 462
Width = 355
Height = 117
Anchors = [akLeft, akTop, akRight]
Left = 279
Top = 274
Width = 312
Height = 158
BevelOuter = bvNone
Caption = 'Panel1'
Ctl3D = False
ParentCtl3D = False
ShowCaption = False
TabOrder = 6
TabOrder = 5
DesignSize = (
355
117)
312
158)
object chkJSONRPC: TCheckBox
Left = 24
Top = 19
Width = 170
Top = 15
Width = 257
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Create JSONRPC 2.0 end-point'
@ -508,26 +490,26 @@ object frmDMVCNewProject: TfrmDMVCNewProject
end
object GroupBoxJSONRPC: TGroupBox
Left = 8
Top = 42
Width = 338
Height = 71
Anchors = [akLeft, akTop, akRight, akBottom]
Top = 38
Width = 295
Height = 108
Anchors = [akLeft, akTop, akRight]
Caption = 'JSON-RPC 2.0 Options'
TabOrder = 1
DesignSize = (
338
71)
295
108)
object Label3: TLabel
Left = 16
Top = 22
Top = 55
Width = 104
Height = 13
Caption = 'End-Point Class Name'
end
object EdtJSONRPCClassName: TEdit
Left = 16
Top = 41
Width = 307
Top = 74
Width = 264
Height = 19
Anchors = [akLeft, akTop, akRight]
TabOrder = 0
@ -537,30 +519,29 @@ object frmDMVCNewProject: TfrmDMVCNewProject
end
object Panel2: TPanel
Left = 0
Top = 267
Width = 355
Height = 193
Anchors = [akLeft, akTop, akRight]
Top = 285
Width = 273
Height = 198
BevelOuter = bvNone
Caption = 'Panel2'
Ctl3D = False
ParentCtl3D = False
ShowCaption = False
TabOrder = 7
TabOrder = 6
DesignSize = (
355
193)
273
198)
object gbControllerUnitOptions: TGroupBox
Left = 8
Top = 27
Width = 339
Height = 157
Width = 257
Height = 162
Anchors = [akLeft, akTop, akRight, akBottom]
Caption = 'Controller Unit Options'
TabOrder = 0
DesignSize = (
339
157)
257
162)
object lblClassName: TLabel
Left = 16
Top = 107
@ -578,7 +559,7 @@ object frmDMVCNewProject: TfrmDMVCNewProject
object chkCreateIndexMethod: TCheckBox
Left = 16
Top = 20
Width = 307
Width = 225
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Create Index And Sample Actions'
@ -589,7 +570,7 @@ object frmDMVCNewProject: TfrmDMVCNewProject
object edtClassName: TEdit
Left = 16
Top = 126
Width = 307
Width = 225
Height = 19
Anchors = [akLeft, akTop, akRight]
TabOrder = 3
@ -597,7 +578,7 @@ object frmDMVCNewProject: TfrmDMVCNewProject
object chkCreateActionFiltersMethods: TCheckBox
Left = 16
Top = 43
Width = 307
Width = 225
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Create Action Filters Methods'
@ -608,7 +589,7 @@ object frmDMVCNewProject: TfrmDMVCNewProject
object chkCreateCRUDMethods: TCheckBox
Left = 16
Top = 66
Width = 307
Width = 225
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Create Sample CRUD Actions'
@ -620,7 +601,7 @@ object frmDMVCNewProject: TfrmDMVCNewProject
object chkCreateControllerUnit: TCheckBox
Left = 24
Top = 4
Width = 288
Width = 206
Height = 17
Anchors = [akLeft, akTop, akRight]
Caption = 'Create Controller Unit'
@ -631,4 +612,60 @@ object frmDMVCNewProject: TfrmDMVCNewProject
OnClick = chkCreateControllerUnitClick
end
end
object GroupBox1: TGroupBox
Left = 287
Top = 147
Width = 301
Height = 107
Caption = 'Middlewares'
TabOrder = 7
DesignSize = (
301
107)
object chkAnalyticsMiddleware: TCheckBox
Left = 16
Top = 50
Width = 135
Height = 17
Anchors = [akTop]
Caption = 'Analytics'
TabOrder = 0
end
object chkCompression: TCheckBox
Left = 16
Top = 24
Width = 153
Height = 17
Anchors = [akTop]
Caption = 'Compression'
TabOrder = 1
end
object chkStaticFiles: TCheckBox
Left = 16
Top = 76
Width = 135
Height = 17
Anchors = [akTop]
Caption = 'Static Files'
TabOrder = 2
end
object chkTrace: TCheckBox
Left = 158
Top = 50
Width = 135
Height = 17
Anchors = [akTop]
Caption = 'Tracing'
TabOrder = 3
end
object chkCORS: TCheckBox
Left = 158
Top = 24
Width = 135
Height = 17
Anchors = [akTop]
Caption = 'CORS'
TabOrder = 4
end
end
end

View File

@ -59,7 +59,6 @@ type
Label2: TLabel;
Image1: TImage;
lblFrameworkVersion: TLabel;
chkAnalyticsMiddleware: TCheckBox;
Panel1: TPanel;
chkJSONRPC: TCheckBox;
GroupBoxJSONRPC: TGroupBox;
@ -76,6 +75,12 @@ type
chkCreateControllerUnit: TCheckBox;
lblBook: TLabel;
Shape1: TShape;
GroupBox1: TGroupBox;
chkAnalyticsMiddleware: TCheckBox;
chkCompression: TCheckBox;
chkStaticFiles: TCheckBox;
chkTrace: TCheckBox;
chkCORS: TCheckBox;
procedure chkCreateControllerUnitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image1Click(Sender: TObject);
@ -96,7 +101,6 @@ type
function GetCreateActionFiltersMethods: boolean;
function GetServerPort: Integer;
function GetCreateCRUDMethods: boolean;
function GetAnalyticsSupport: boolean;
function GetMiddlewares: TArray<String>;
function GetCreateJSONRPCInterface: boolean;
function GetJSONRPCClassName: String;
@ -109,7 +113,6 @@ type
property AddToProjectGroup: boolean read GetAddToProjectGroup;
property CreateIndexMethod: boolean read GetCreateIndexMethod;
property CreateCRUDMethods: boolean read GetCreateCRUDMethods;
property AnalyticsSupport: boolean read GetAnalyticsSupport;
property Middlewares: TArray<String> read GetMiddlewares;
property CreateActionFiltersMethods: boolean
read GetCreateActionFiltersMethods;
@ -124,7 +127,7 @@ implementation
uses
DMVC.Expert.CodeGen.Templates,
MVCFramework.Commons;
MVCFramework.Commons, System.StrUtils;
{$R *.dfm}
@ -157,11 +160,6 @@ begin
Result := chkAddToProjectGroup.Checked;
end;
function TfrmDMVCNewProject.GetAnalyticsSupport: boolean;
begin
Result := chkAnalyticsMiddleware.Checked;
end;
function TfrmDMVCNewProject.GetCreateIndexMethod: boolean;
begin
Result := chkCreateIndexMethod.Checked;
@ -189,12 +187,21 @@ begin
end;
function TfrmDMVCNewProject.GetMiddlewares: TArray<String>;
const
M_ANALYTICS = 'FMVC.AddMiddleware(TMVCAnalyticsMiddleware.Create(GetAnalyticsDefaultLogger));';
M_STATICFILES = 'FMVC.AddMiddleware(TMVCStaticFilesMiddleware.Create(''/static'', TPath.Combine(ExtractFilePath(GetModuleName(HInstance)), ''www'')));';
M_TRACE = 'FMVC.AddMiddleware(TMVCTraceMiddleware.Create);';
M_COMPRESSION = 'FMVC.AddMiddleware({must be the latest middleware registered} TMVCCompressionMiddleware.Create);';
M_CORS = 'FMVC.AddMiddleware(TMVCCORSMiddleware.Create);';
begin
Result := [];
if AnalyticsSupport then
begin
Result := Result + ['TMVCAnalyticsMiddleware.Create(GetLoggerForAnalytics)'];
end;
Result := Result + [ifthen(not chkAnalyticsMiddleware.Checked, '//') + M_ANALYTICS];
Result := Result + ['// The folder mapped as documentroot for TMVCStaticFilesMiddleware must exists!'];
Result := Result + [ifthen(not chkStaticFiles.Checked, '//') + M_STATICFILES];
Result := Result + [ifthen(not chkTrace.Checked, '//') + M_TRACE];
Result := Result + [ifthen(not chkCORS.Checked, '//') + M_CORS];
Result := Result + ['// Compression middleware must be the last in the chain'];
Result := Result + [ifthen(not chkCompression.Checked, '//') + M_COMPRESSION];
end;
function TfrmDMVCNewProject.GetServerPort: Integer;

View File

@ -71,3 +71,4 @@ samples/110_rest_appender_mobile/Android/
.doit.db.dat
unittests/Win32/PLAINDUNITX/dunitx-results.xml
unittests/Win32/TESTINSIGHT/TestInsightSettings.ini
*.log

View File

@ -1,11 +0,0 @@
{
"id": "{E35C7797-DC25-4F38-95B7-5D7133D85A2F}",
"name": "LoggerPro",
"license_type": "Apache 2.0",
"license_file": "LICENSE",
"platforms": "Win32;Win64",
"package_compiler_min": 23,
"package_compiler_max": 32,
"compiler_min": 23,
"compiler_max": 32
}

View File

@ -1,25 +0,0 @@
{
"search_pathes": [{
"pathes": ".",
"platforms": "Win32;Win64"
}],
"browsing_pathes": [{
"pathes": ".",
"platforms": "Win32;Win64"
}],
"source_folders": [{
"folder": "."
},
{
"folder": "docs",
"recursive": true
},
{
"folder": "samples",
"recursive": true
},
{
"folder": "unittests",
"recursive": true
}]
}

View File

@ -31,8 +31,6 @@ type
class var FConsoleAllocated: Int64; // used to ensure one and only one console is created
class constructor Create; // allocate global vars
class destructor Destroy;
private
fFormatSettings: TFormatSettings; // dealocate global vars
protected
procedure SetColor(const Color: Integer);
public
@ -58,7 +56,6 @@ const
function AttachConsole; external kernel32 name 'AllocConsole';
const
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';
{ FOREGROUND COLORS - CAN BE COMBINED }
FOREGROUND_BLUE = 1; { text color blue. }
FOREGROUND_GREEN = 2; { text color green }
@ -77,7 +74,7 @@ end;
procedure TLoggerProConsoleAppender.Setup;
begin
fFormatSettings := LoggerPro.GetDefaultFormatSettings;
inherited;
if TInterlocked.read(TLoggerProConsoleAppender.FConsoleAllocated) < 2 then
begin
TLoggerProConsoleAppender.FLock.Enter;
@ -119,8 +116,9 @@ begin
TLogType.Error:
lColor := FOREGROUND_RED or FOREGROUND_INTENSITY;
end;
lText := Format(DEFAULT_LOG_FORMAT, [datetimetostr(aLogItem.TimeStamp, fFormatSettings), aLogItem.ThreadID, aLogItem.LogTypeAsString, aLogItem.LogMessage,
aLogItem.LogTag]);
lText := FormatLog(aLogItem);
TLoggerProConsoleAppender.FLock.Enter;
try
SetColor(lColor);

View File

@ -46,9 +46,7 @@ type
fOnNetSendError: TOnNetSendError;
fExtendedInfo: TLoggerProExtendedInfo;
fEventStreamsProxy: TEventStreamsRPCProxy;
fLogFormat: string;
fDMSContainerAPIKey: String;
fFormatSettings: TFormatSettings;
fExtendedInfoData: array [low(TLogExtendedInfo) .. high(TLogExtendedInfo)] of string;
procedure SetOnCreateJSONData(const Value: TOnCreateJSONData);
procedure SetOnNetSendError(const Value: TOnNetSendError);
@ -59,7 +57,6 @@ type
procedure LoadExtendedInfo;
function GetExtendedInfo: TJSONObject;
protected const
DEFAULT_LOG_FORMAT = '%0:s [TID %1:10u][%2:-8s] %3:s {EI%4:s}[%5:s]';
DEFAULT_EXTENDED_INFO = [TLogExtendedInfo.EIUserName, TLogExtendedInfo.EIComputerName,
TLogExtendedInfo.EIProcessName,
TLogExtendedInfo.EIProcessID, TLogExtendedInfo.EIDeviceID];
@ -70,8 +67,7 @@ type
aDMSContainerAPIKey: String;
aEventStreamsQueueNameBase: String = 'queues.logs.';
aLogItemAggregationType: TDMSQueueAggregationType = dmsatByTag;
aLogExtendedInfo: TLoggerProExtendedInfo = DEFAULT_EXTENDED_INFO;
aLogFormat: string = DEFAULT_LOG_FORMAT); reintroduce;
aLogExtendedInfo: TLoggerProExtendedInfo = DEFAULT_EXTENDED_INFO); reintroduce;
destructor Destroy; override;
property OnCreateJSONData: TOnCreateJSONData read fOnCreateJSONData write SetOnCreateJSONData;
property OnNetSendError: TOnNetSendError read fOnNetSendError write SetOnNetSendError;
@ -130,8 +126,7 @@ constructor TLoggerProDMSContainerAppender.Create(
aDMSContainerAPIKey: String;
aEventStreamsQueueNameBase: String;
aLogItemAggregationType: TDMSQueueAggregationType;
aLogExtendedInfo: TLoggerProExtendedInfo;
aLogFormat: string);
aLogExtendedInfo: TLoggerProExtendedInfo);
begin
inherited Create;
fEventStreamsProxy := aEventStreamsProxy;
@ -139,15 +134,12 @@ begin
fLogItemAggregationType := aLogItemAggregationType;
if not fQueueNameBase.EndsWith('.') then
fQueueNameBase := fQueueNameBase + '.';
fLogFormat := aLogFormat;
fExtendedInfo := aLogExtendedInfo;
fDMSContainerAPIKey := aDMSContainerAPIKey;
LoadExtendedInfo;
end;
function TLoggerProDMSContainerAppender.CreateData(const SrcLogItem: TLogItem): TJSONObject;
var
lLog: TJSONObject;
begin
Result := nil;
try
@ -178,7 +170,7 @@ function TLoggerProDMSContainerAppender.GetDefaultLog(const aLogItem: TLogItem):
begin
Result := TJSONObject.Create;
try
Result.S['timestamp'] := datetimetostr(aLogItem.TimeStamp, fFormatSettings);
Result.S['timestamp'] := datetimetostr(aLogItem.TimeStamp, FormatSettings);
Result.L['tid'] := aLogItem.ThreadID;
Result.S['type'] := aLogItem.LogTypeAsString;
Result.S['text'] := aLogItem.LogMessage;
@ -194,7 +186,7 @@ function TLoggerProDMSContainerAppender.GetExtendedInfo: TJSONObject;
begin
Result := TJSONObject.Create;
try
{$IFDEF MSWINDOWS}
{$IF Defined(MSWINDOWS)}
if TLogExtendedInfo.EIUserName in fExtendedInfo then
begin
Result.S['username'] := fExtendedInfoData[TLogExtendedInfo.EIUserName];
@ -226,7 +218,7 @@ end;
class function TLoggerProDMSContainerAppender.GetModuleBaseName: String;
begin
{$IF DEFINED(MSWINDOWS)}
{$IF Defined(MSWINDOWS)}
Result := TPath.ChangeExtension(TPath.GetFileName(GetModuleName(HInstance)), '');
{$ENDIF}
{$IF Defined(Android)}
@ -240,7 +232,7 @@ end;
procedure TLoggerProDMSContainerAppender.LoadExtendedInfo;
begin
{$IF DEFINED(MSWINDOWS)}
{$IF Defined(MSWINDOWS)}
if TLogExtendedInfo.EIProcessID in fExtendedInfo then
begin
fExtendedInfoData[TLogExtendedInfo.EIProcessID] := IntToStr(GetCurrentProcessId);
@ -282,7 +274,6 @@ end;
procedure TLoggerProDMSContainerAppender.Setup;
begin
fFormatSettings := LoggerPro.GetDefaultFormatSettings;
inherited;
end;
@ -295,7 +286,6 @@ procedure TLoggerProDMSContainerAppender.InternalWriteLog(const aLogItem: TLogIt
const aJSONObject: TJSONObject);
var
lRetryCount: Integer;
lResp: IHTTPResponse;
lJSONResp: TJSONObject;
const
MAX_RETRY_COUNT = 5;
@ -331,9 +321,7 @@ end;
procedure TLoggerProDMSContainerAppender.WriteLog(const aLogItem: TLogItem);
var
lData: TJSONObject;
lRetryCount: Integer;
lResp: IHTTPResponse;
lJSONResp: TJSONObject;
lQueueName: string;
const

View File

@ -26,7 +26,7 @@ type
/// </summary>
procedure PrepareMessage(const aLogItem: TLogItem; out aSubject, aBody: String); virtual;
public
constructor Create(aSMTP: TIdSMTP; const aFromAddresses, aToAddresses: String); reintroduce;
constructor Create(aSMTP: TIdSMTP; const aFromAddresses, aToAddresses: String; aLogFormat: string = DEFAULT_LOG_FORMAT); reintroduce;
procedure Setup; override;
procedure TearDown; override;
procedure WriteLog(const aLogItem: TLogItem); override;
@ -38,12 +38,9 @@ implementation
uses
System.SysUtils, IdMessage;
const
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-8s] %3:s [%4:s]';
constructor TLoggerProEMailAppender.Create(aSMTP: TIdSMTP; const aFromAddresses, aToAddresses: String);
constructor TLoggerProEMailAppender.Create(aSMTP: TIdSMTP; const aFromAddresses, aToAddresses: String; aLogFormat: string);
begin
inherited Create;
inherited Create(aLogFormat);
FSMTP := aSMTP;
FFromAddresses := aFromAddresses;
FToAddresses := aToAddresses;
@ -55,14 +52,12 @@ procedure TLoggerProEMailAppender.PrepareMessage(const aLogItem: TLogItem;
out aSubject, aBody: String);
begin
aSubject := 'LoggerPro ' + aLogItem.LogTypeAsString.ToUpper + ' [' + aLogItem.LogTag + ']';
aBody := Format(DEFAULT_LOG_FORMAT, [datetimetostr(aLogItem.TimeStamp),
aLogItem.ThreadID, aLogItem.LogTypeAsString, aLogItem.LogMessage,
aLogItem.LogTag]);
aBody := FormatLog(aLogItem);
end;
procedure TLoggerProEMailAppender.Setup;
begin
//
inherited;
end;
procedure TLoggerProEMailAppender.TearDown;

View File

@ -40,45 +40,29 @@ type
TFileAppenderOption = (IncludePID);
TFileAppenderOptions = set of TFileAppenderOption;
TFileAppenderLogRow = reference to procedure(const LogItem: TLogItem; out LogRow: string);
{ @abstract(The default file appender)
To learn how to use this appender, check the sample @code(file_appender.dproj)
{ @abstract(The base class for different file appenders)
Do not use this class directly, but one of TLoggerProFileAppender or TLoggerProSimpleFileAppender.
Check the sample @code(file_appender.dproj)
}
TLoggerProFileAppender = class(TLoggerProAppenderBase)
TLoggerProFileAppenderBase = class(TLoggerProAppenderBase)
private
fFormatSettings: TFormatSettings;
fWritersDictionary: TObjectDictionary<string, TStreamWriter>;
fMaxBackupFileCount: Integer;
fMaxFileSizeInKiloByte: Integer;
fLogFormat: string;
fLogFileNameFormat: string;
fFileAppenderOptions: TFileAppenderOptions;
fLogsFolder: string;
fEncoding: TEncoding;
fOnLogRow: TFileAppenderLogRow;
function CreateWriter(const aFileName: string): TStreamWriter;
procedure AddWriter(const aLogItem: TLogItem; var lWriter: TStreamWriter; var lLogFileName: string);
procedure RotateLog(const aLogItem: TLogItem; lWriter: TStreamWriter);
procedure RetryMove(const aFileSrc, aFileDest: string);
protected
function GetLogFileName(const aTag: string; const aFileNumber: Integer): string;
procedure InternalWriteLog(const aStreamWriter: TStreamWriter; const aValue: string); inline;
procedure WriteToStream(const aStreamWriter: TStreamWriter; const aValue: string); inline;
procedure RotateFile(const aLogTag: string; out aNewFileName: string); virtual;
procedure InternalWriteLog(const aStreamWriter: TStreamWriter; const aLogItem: TLogItem);
public const
{ @abstract(Defines the default format string used by the @link(TLoggerProFileAppender).)
The positional parameters are the followings:
@orderedList(
@itemSetNumber 0
@item TimeStamp
@item ThreadID
@item LogType
@item LogMessage
@item LogTag
)
}
DEFAULT_LOG_FORMAT = '%0:s [TID %1:10u][%2:-8s] %3:s [%4:s]';
{ @abstract(Defines the default format string used by the @link(TLoggerProFileAppender).)
The positional parameters are the followings:
The positional parameters are the following:
@orderedList(
@item SetNumber 0
@item ModuleName
@ -86,30 +70,63 @@ type
@item LogTag
)
}
DEFAULT_FILENAME_FORMAT = '%s.%2.2d.%s.log';
{ @abstract(Defines number of log file set to mantain during logs rotation) }
DEFAULT_FILENAME_FORMAT = '%0:s.%1:2.2d.%2:s.log';
{ @abstract(Defines number of log file set to maintain during logs rotation) }
DEFAULT_MAX_BACKUP_FILE_COUNT = 5;
{ @abstract(Defines the max size of each log file)
The actual meaning is: "If the file size is > than @link(DEFAULT_MAX_FILE_SIZE_KB) then rotate logs. }
DEFAULT_MAX_FILE_SIZE_KB = 1000;
{ @abstract(Milliseconds to wait between the RETRY_COUNT times. }
RETRY_DELAY = 200;
{ @abstract(How much times we have to retry if the file is locked?. }
{ @abstract(How many times do we have to retry if the file is locked?. }
RETRY_COUNT = 5;
constructor Create(aMaxBackupFileCount: Integer = DEFAULT_MAX_BACKUP_FILE_COUNT;
aMaxFileSizeInKiloByte: Integer = DEFAULT_MAX_FILE_SIZE_KB; aLogsFolder: string = ''; aFileAppenderOptions: TFileAppenderOptions = [];
aLogFileNameFormat: string = DEFAULT_FILENAME_FORMAT; aLogFormat: string = DEFAULT_LOG_FORMAT; aEncoding: TEncoding = nil);
reintroduce;
procedure Setup; override;
end;
{ @abstract(The default file appender)
This file appender separates TLogItems with different tags into a log file for each tag.
To learn how to use this appender, check the sample @code(file_appender.dproj)
}
TLoggerProFileAppender = class(TLoggerProFileAppenderBase)
private
fWritersDictionary: TObjectDictionary<string, TStreamWriter>;
procedure AddWriter(const aLogTag: string; var aWriter: TStreamWriter; var aLogFileName: string);
procedure RotateLog(const aLogTag: string; aWriter: TStreamWriter);
public
procedure Setup; override;
procedure TearDown; override;
procedure WriteLog(const aLogItem: TLogItem); overload; override;
end;
{ @abstract(A simple file appender)
This file appender writes all TLogItems into a single log file.
Combined with a @code(TLoggerProAppenderFilterImpl) you can filter out any log tags you like.
If you want to run several TLoggerProSimpleFileAppender in parallel you have to provide a different
LogFileFormat for each of them in the constructor in order to prevent name collisions.
To learn how to use this appender, check the sample @code(file_appender.dproj)
}
TLoggerProSimpleFileAppender = class(TLoggerProFileAppenderBase)
private const
cDefaultLogTag = '---';
private
fFileWriter: TStreamWriter;
procedure RotateLog;
public
procedure Setup; override;
procedure TearDown; override;
procedure WriteLog(const aLogItem: TLogItem); overload; override;
property OnLogRow: TFileAppenderLogRow read fOnLogRow write fOnLogRow;
end;
implementation
uses
System.IOUtils,
System.StrUtils,
System.Math,
idGlobal
{$IF Defined(Android)}
,Androidapi.Helpers
@ -118,9 +135,9 @@ uses
{$ENDIF}
;
{ TLoggerProFileAppender }
{ TLoggerProFileAppenderBase }
function TLoggerProFileAppender.GetLogFileName(const aTag: string; const aFileNumber: Integer): string;
function TLoggerProFileAppenderBase.GetLogFileName(const aTag: string; const aFileNumber: Integer): string;
var
lExt: string;
lModuleName: string;
@ -146,8 +163,10 @@ begin
Result := TPath.Combine(lPath, lExt);
end;
procedure TLoggerProFileAppender.Setup;
procedure TLoggerProFileAppenderBase.Setup;
begin
inherited;
if fLogsFolder = '' then
begin
{$IF (Defined(MSWINDOWS) or Defined(POSIX)) and (not Defined(MOBILE))}
@ -159,51 +178,20 @@ begin
end;
if not TDirectory.Exists(fLogsFolder) then
TDirectory.CreateDirectory(fLogsFolder);
fFormatSettings := LoggerPro.GetDefaultFormatSettings;
fWritersDictionary := TObjectDictionary<string, TStreamWriter>.Create([doOwnsValues]);
end;
procedure TLoggerProFileAppender.TearDown;
begin
fWritersDictionary.Free;
end;
procedure TLoggerProFileAppender.InternalWriteLog(const aStreamWriter: TStreamWriter; const aValue: string);
procedure TLoggerProFileAppenderBase.WriteToStream(const aStreamWriter: TStreamWriter; const aValue: string);
begin
aStreamWriter.WriteLine(aValue);
aStreamWriter.Flush;
end;
procedure TLoggerProFileAppender.WriteLog(const aLogItem: TLogItem);
var
lWriter: TStreamWriter;
lLogFileName: string;
lLogRow: string;
procedure TLoggerProFileAppenderBase.InternalWriteLog(const aStreamWriter: TStreamWriter; const aLogItem: TLogItem);
begin
if not fWritersDictionary.TryGetValue(aLogItem.LogTag, lWriter) then
begin
AddWriter(aLogItem, lWriter, lLogFileName);
end;
if not Assigned(fOnLogRow) then
begin
InternalWriteLog(lWriter, Format(fLogFormat, [datetimetostr(aLogItem.TimeStamp, fFormatSettings), aLogItem.ThreadID,
aLogItem.LogTypeAsString, aLogItem.LogMessage, aLogItem.LogTag]));
end
else
begin
fOnLogRow(aLogItem, lLogRow);
InternalWriteLog(lWriter, lLogRow);
end;
if lWriter.BaseStream.Size > fMaxFileSizeInKiloByte * 1024 then
begin
RotateLog(aLogItem, lWriter);
end;
WriteToStream(aStreamWriter, FormatLog(aLogItem));
end;
procedure TLoggerProFileAppender.RetryMove(const aFileSrc, aFileDest: string);
procedure TLoggerProFileAppenderBase.RetryMove(const aFileSrc, aFileDest: string);
var
lRetries: Integer;
const
@ -233,51 +221,37 @@ begin
raise ELoggerPro.CreateFmt('Cannot rename %s to %s', [aFileSrc, aFileDest]);
end;
procedure TLoggerProFileAppender.RotateLog(const aLogItem: TLogItem; lWriter: TStreamWriter);
procedure TLoggerProFileAppenderBase.RotateFile(const aLogTag: string; out aNewFileName: string);
var
lLogFileName: string;
lRenamedFile: string;
I: Integer;
lCurrentFileName: string;
begin
InternalWriteLog(lWriter, '#[ROTATE LOG ' + datetimetostr(Now, fFormatSettings) + ']');
fWritersDictionary.Remove(aLogItem.LogTag);
lLogFileName := GetLogFileName(aLogItem.LogTag, 0);
aNewFileName := GetLogFileName(aLogTag, 0);
// remove the last file of backup set
lRenamedFile := GetLogFileName(aLogItem.LogTag, fMaxBackupFileCount);
lRenamedFile := GetLogFileName(aLogTag, fMaxBackupFileCount);
if TFile.Exists(lRenamedFile) then
TFile.Delete(lRenamedFile);
// shift the files names
for I := fMaxBackupFileCount - 1 downto 1 do
begin
lCurrentFileName := GetLogFileName(aLogItem.LogTag, I);
lRenamedFile := GetLogFileName(aLogItem.LogTag, I + 1);
lCurrentFileName := GetLogFileName(aLogTag, I);
lRenamedFile := GetLogFileName(aLogTag, I + 1);
if TFile.Exists(lCurrentFileName) then
RetryMove(lCurrentFileName, lRenamedFile);
end;
lRenamedFile := GetLogFileName(aLogItem.LogTag, 1);
RetryMove(lLogFileName, lRenamedFile);
// read the writer
AddWriter(aLogItem, lWriter, lLogFileName);
InternalWriteLog(lWriter, '#[START LOG ' + datetimetostr(Now, fFormatSettings) + ']');
lRenamedFile := GetLogFileName(aLogTag, 1);
RetryMove(aNewFileName, lRenamedFile);
end;
procedure TLoggerProFileAppender.AddWriter(const aLogItem: TLogItem; var lWriter: TStreamWriter; var lLogFileName: string);
begin
lLogFileName := GetLogFileName(aLogItem.LogTag, 0);
lWriter := CreateWriter(lLogFileName);
fWritersDictionary.Add(aLogItem.LogTag, lWriter);
end;
constructor TLoggerProFileAppender.Create(aMaxBackupFileCount: Integer; aMaxFileSizeInKiloByte: Integer; aLogsFolder: string;
constructor TLoggerProFileAppenderBase.Create(aMaxBackupFileCount: Integer; aMaxFileSizeInKiloByte: Integer; aLogsFolder: string;
aFileAppenderOptions: TFileAppenderOptions; aLogFileNameFormat: string; aLogFormat: string; aEncoding: TEncoding);
begin
inherited Create;
inherited Create(ALogFormat);
fLogsFolder := aLogsFolder;
fMaxBackupFileCount := aMaxBackupFileCount;
fMaxBackupFileCount:= Min(1, aMaxBackupFileCount);
fMaxFileSizeInKiloByte := aMaxFileSizeInKiloByte;
fLogFormat := aLogFormat;
fLogFileNameFormat := aLogFileNameFormat;
fFileAppenderOptions := aFileAppenderOptions;
if Assigned(aEncoding) then
@ -286,7 +260,7 @@ begin
fEncoding := TEncoding.DEFAULT;
end;
function TLoggerProFileAppender.CreateWriter(const aFileName: string): TStreamWriter;
function TLoggerProFileAppenderBase.CreateWriter(const aFileName: string): TStreamWriter;
var
lFileStream: TFileStream;
lFileAccessMode: Word;
@ -329,5 +303,94 @@ begin
end;
end;
{ TLoggerProFileAppender }
procedure TLoggerProFileAppender.AddWriter(const aLogTag:string; var aWriter: TStreamWriter; var aLogFileName: string);
begin
aLogFileName := GetLogFileName(aLogTag, 0);
aWriter := CreateWriter(aLogFileName);
fWritersDictionary.Add(aLogTag, aWriter);
end;
procedure TLoggerProFileAppender.RotateLog(const aLogTag: string; aWriter: TStreamWriter);
var
lLogFileName: string;
begin
WriteToStream(aWriter, '#[ROTATE LOG ' + datetimetostr(Now, FormatSettings) + ']');
// remove the writer during rename
fWritersDictionary.Remove(aLogTag);
RotateFile(aLogTag, lLogFileName);
// re-create the writer
AddWriter(aLogTag, aWriter, lLogFileName);
WriteToStream(aWriter, '#[START LOG ' + datetimetostr(Now, FormatSettings) + ']');
end;
procedure TLoggerProFileAppender.Setup;
begin
inherited;
fWritersDictionary := TObjectDictionary<string, TStreamWriter>.Create([doOwnsValues]);
end;
procedure TLoggerProFileAppender.TearDown;
begin
fWritersDictionary.Free;
inherited;
end;
procedure TLoggerProFileAppender.WriteLog(const aLogItem: TLogItem);
var
lWriter: TStreamWriter;
lLogFileName:string;
begin
if not fWritersDictionary.TryGetValue(aLogItem.LogTag, lWriter) then
begin
AddWriter(aLogItem.LogTag, lWriter, lLogFileName);
end;
InternalWriteLog(lWriter, aLogItem);
if lWriter.BaseStream.Size > fMaxFileSizeInKiloByte * 1024 then
begin
RotateLog(aLogItem.LogTag, lWriter);
end;
end;
{ TLoggerProSimpleFileAppender }
procedure TLoggerProSimpleFileAppender.RotateLog;
var
lLogFileName: string;
begin
WriteToStream(fFileWriter, '#[ROTATE LOG ' + datetimetostr(Now, FormatSettings) + ']');
// remove the writer during rename
fFileWriter.Free;
RotateFile(cDefaultLogTag, lLogFileName);
// re-create the writer
fFileWriter := CreateWriter(GetLogFileName(cDefaultLogTag, 0));
WriteToStream(fFileWriter, '#[START LOG ' + datetimetostr(Now, FormatSettings) + ']');
end;
procedure TLoggerProSimpleFileAppender.Setup;
begin
inherited;
fFileWriter := CreateWriter(GetLogFileName(cDefaultLogTag, 0));
end;
procedure TLoggerProSimpleFileAppender.TearDown;
begin
fFileWriter.Free;
inherited;
end;
procedure TLoggerProSimpleFileAppender.WriteLog(const aLogItem: TLogItem);
begin
InternalWriteLog(fFileWriter, aLogItem);
if fFileWriter.BaseStream.Size > fMaxFileSizeInKiloByte * 1024 then
begin
RotateLog;
end;
end;
end.

View File

@ -61,10 +61,7 @@ type
FUserName, FMachineName: string;
FEphemeral: Boolean;
FLastSignature: string;
FLogFormat: string;
FFormatSettings: TFormatSettings;
public
const DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-8s] %3:s [%4:s]';
const DEFAULT_NSQ_URL = 'http://127.0.0.1:4151';
function GetNSQUrl: string;
@ -96,22 +93,19 @@ type
procedure Setup; override;
procedure WriteLog(const aLogItem: TLogItem); override;
function CreateData(const SrcLogItem: TLogItem): TStream; virtual;
function FormatLog(const aLogItem: TLogItem): string; virtual;
end;
implementation
uses System.NetEncoding;
constructor TLoggerProNSQAppenderBase.Create(aTopic: string=''; aEphemeral:
Boolean = False; aNSQUrl: string=DEFAULT_NSQ_URL; aLogFormat:
string=DEFAULT_LOG_FORMAT);
constructor TLoggerProNSQAppenderBase.Create(aTopic: string; aEphemeral: Boolean;
aNSQUrl: string; aLogFormat: string);
begin
inherited Create();
inherited Create(aLogFormat);
FEphemeral := aEphemeral;
FNSQUrl := 'http://127.0.0.1:4151';
FUserName := aNSQUrl;
FLogFormat := aLogFormat;
FTopic := aTopic;
end;
@ -137,13 +131,6 @@ begin
end;
end;
function TLoggerProNSQAppenderBase.FormatLog(
const aLogItem: TLogItem): string;
begin
result := Format(FLogFormat, [datetimetostr(aLogItem.TimeStamp, FFormatSettings), aLogItem.ThreadID,
aLogItem.LogTypeAsString, aLogItem.LogMessage, aLogItem.LogTag])
end;
function TLoggerProNSQAppenderBase.GetNSQUrl: string;
begin
result := FNSQUrl;
@ -182,7 +169,6 @@ end;
procedure TLoggerProNSQAppenderBase.Setup;
begin
FFormatSettings := LoggerPro.GetDefaultFormatSettings;
inherited;
end;

View File

@ -17,7 +17,7 @@ type
FModuleName: string;
{$ENDIF}
public
constructor Create; override;
constructor Create(ALogFormat: string = DEFAULT_LOG_FORMAT); override;
procedure Setup; override;
procedure TearDown; override;
procedure WriteLog(const aLogItem: TLogItem); override;
@ -34,17 +34,16 @@ uses
{$ENDIF}
;
{ TStringsLogAppender }
const
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';
{ TLoggerProOutputDebugStringAppender }
constructor TLoggerProOutputDebugStringAppender.Create;
constructor TLoggerProOutputDebugStringAppender.Create(ALogFormat: string);
begin
inherited Create;
inherited;
end;
procedure TLoggerProOutputDebugStringAppender.Setup;
begin
inherited;
{$IFDEF MSWINDOWS}
FModuleName := TPath.GetFileName(GetModuleName(HInstance));
{$ENDIF}
@ -55,17 +54,14 @@ begin
// do nothing
end;
procedure TLoggerProOutputDebugStringAppender.WriteLog(const aLogItem
: TLogItem);
procedure TLoggerProOutputDebugStringAppender.WriteLog(const aLogItem : TLogItem);
{$IFDEF MSWINDOWS}
var
lLog: string;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
lLog := '(' + FModuleName + ') ' + Format(DEFAULT_LOG_FORMAT,
[datetimetostr(aLogItem.TimeStamp), aLogItem.ThreadID,
aLogItem.LogTypeAsString, aLogItem.LogMessage, aLogItem.LogTag]);
lLog := '(' + FModuleName + ') ' + FormatLog(aLogItem);
OutputDebugString(PChar(lLog));
{$ENDIF}
end;

View File

@ -1,4 +1,4 @@
unit LoggerPro.RESTAppender;
unit LoggerPro.RESTAppender;
interface
@ -13,7 +13,7 @@ type
{
Log appender for a REST endpoint
Author: Daniele Teti (https://github.com/danieleteti/)
Some ideas from NSQ appender from Stéphane "Fulgan" GROBETY (https://github.com/Fulgan/)
Some ideas from NSQ appender from Stéphane "Fulgan" GROBETY (https://github.com/Fulgan/)
}
TOnCreateData = reference to procedure(const Sender: TObject; const LogItem: TLogItem; const ExtendedInfo: TLoggerProExtendedInfo;
@ -28,17 +28,27 @@ type
fExtendedInfo: TLoggerProExtendedInfo;
fContentType: string;
fRESTUrl: string;
fLogFormat: string;
fFormatSettings: TFormatSettings;
{$IFDEF MSWINDOWS}
{.$IFDEF MSWINDOWS}
fExtendedInfoData: array [low(TLogExtendedInfo) .. high(TLogExtendedInfo)] of string;
{$ENDIF}
{.$ENDIF}
procedure SetOnCreateData(const Value: TOnCreateData);
procedure SetOnNetSendError(const Value: TOnNetSendError);
strict protected
procedure LoadExtendedInfo;
function GetExtendedInfo: string;
protected const
{ @abstract(Defines the default format string used by the @link(TLoggerProRESTAppender).)
The positional parameters are the following:
@orderedList(
@item SetNumber 0
@item TimeStamp
@item ThreadID
@item LogType
@item LogMessage
@item Extended Information
@item LogTag
)
}
DEFAULT_LOG_FORMAT = '%0:s [TID %1:10u][%2:-8s] %3:s {EI%4:s}[%5:s]';
DEFAULT_EXTENDED_INFO = [TLogExtendedInfo.EIUserName, TLogExtendedInfo.EIComputerName, TLogExtendedInfo.EIProcessName,
TLogExtendedInfo.EIProcessID, TLogExtendedInfo.EIDeviceID];
@ -56,7 +66,7 @@ type
procedure TearDown; override;
procedure Setup; override;
function CreateData(const SrcLogItem: TLogItem): TStream; virtual;
function FormatLog(const aLogItem: TLogItem): string; virtual;
function FormatLog(const aLogItem: TLogItem): string; override;
end;
implementation
@ -108,17 +118,14 @@ end;
constructor TLoggerProRESTAppender.Create(aRESTUrl: string = DEFAULT_REST_URL; aContentType: string = 'text/plain';
aLogExtendedInfo: TLoggerProExtendedInfo = DEFAULT_EXTENDED_INFO; aLogFormat: string = DEFAULT_LOG_FORMAT);
begin
inherited Create;
inherited Create(aLogFormat);
fRESTUrl := aRESTUrl;
fLogFormat := aLogFormat;
fExtendedInfo := aLogExtendedInfo;
fContentType := aContentType;
LoadExtendedInfo;
end;
function TLoggerProRESTAppender.CreateData(const SrcLogItem: TLogItem): TStream;
var
lLog: string;
begin
Result := nil;
try
@ -128,7 +135,6 @@ begin
end
else
begin
lLog := FormatLog(SrcLogItem);
Result := TStringStream.Create(FormatLog(SrcLogItem), TEncoding.UTF8);
end;
except
@ -142,7 +148,7 @@ end;
function TLoggerProRESTAppender.FormatLog(const aLogItem: TLogItem): string;
begin
Result := Format(fLogFormat, [datetimetostr(aLogItem.TimeStamp, fFormatSettings), aLogItem.ThreadID, aLogItem.LogTypeAsString,
Result := Format(LogFormat, [datetimetostr(aLogItem.TimeStamp, FormatSettings), aLogItem.ThreadID, aLogItem.LogTypeAsString,
aLogItem.LogMessage, GetExtendedInfo, aLogItem.LogTag]);
end;
@ -231,7 +237,6 @@ end;
procedure TLoggerProRESTAppender.Setup;
begin
fFormatSettings := LoggerPro.GetDefaultFormatSettings;
inherited;
end;

View File

@ -21,7 +21,7 @@ type
FLogKeyPrefix: string;
FMaxSize: Int64;
public
constructor Create(aRedis: IRedisClient; aMaxSize: Int64 = 5000; aKeyPrefix: string = 'loggerpro'); reintroduce;
constructor Create(aRedis: IRedisClient; aMaxSize: Int64 = 5000; aKeyPrefix: string = 'loggerpro'; aLogFormat: string = DEFAULT_LOG_FORMAT); reintroduce;
procedure Setup; override;
procedure TearDown; override;
procedure WriteLog(const aLogItem: TLogItem); override;
@ -33,12 +33,9 @@ implementation
uses
System.SysUtils;
const
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-8s] %3:s [%4:s]';
constructor TLoggerProRedisAppender.Create(aRedis: IRedisClient; aMaxSize: Int64; aKeyPrefix: string);
constructor TLoggerProRedisAppender.Create(aRedis: IRedisClient; aMaxSize: Int64; aKeyPrefix: string; aLogFormat: string);
begin
inherited Create;
inherited Create(aLogFormat);
FRedis := aRedis;
FLogKeyPrefix := aKeyPrefix;
FMaxSize := aMaxSize;
@ -46,6 +43,7 @@ end;
procedure TLoggerProRedisAppender.Setup;
begin
inherited;
FRedis.Connect;
end;
@ -74,9 +72,7 @@ var
lText: string;
lKey: string;
begin
lText := Format(DEFAULT_LOG_FORMAT, [datetimetostr(aLogItem.TimeStamp),
aLogItem.ThreadID, aLogItem.LogTypeAsString, aLogItem.LogMessage,
aLogItem.LogTag]);
lText := FormatLog(aLogItem);
lKey := FLogKeyPrefix + '::logs'; // + aLogItem.LogTypeAsString.ToLower;
// Push the log item to the right of the list (logs:info, logs:warning, log:error)
FRedis.RPUSH(lKey, [lText]);

View File

@ -18,8 +18,6 @@ type
To learn how to use this appender, check the sample @code(SimpleConsole_appender.dproj)
}
TLoggerProSimpleConsoleAppender = class(TLoggerProAppenderBase)
private
FFormatSettings: TFormatSettings;
public
procedure Setup; override;
procedure TearDown; override;
@ -31,7 +29,7 @@ implementation
procedure TLoggerProSimpleConsoleAppender.Setup;
begin
FFormatSettings := LoggerPro.GetDefaultFormatSettings;
inherited;
end;
procedure TLoggerProSimpleConsoleAppender.TearDown;
@ -40,14 +38,8 @@ begin
end;
procedure TLoggerProSimpleConsoleAppender.WriteLog(const aLogItem: TLogItem);
var
lText: string;
ds: string;
begin
ds := DateTimeToStr(aLogItem.TimeStamp, FFormatSettings);
lText := Format('[%-8s] %s [%2:-10s] %s', [aLogItem.LogTag, ds, aLogItem.LogTypeAsString, aLogItem.LogMessage],
FFormatSettings);
Writeln(lText);
Writeln(FormatLog(aLogItem));
end;
end.

View File

@ -15,20 +15,7 @@ type
private
FLB: TListBox;
FMaxLogLines: Word;
FLogFormat: string;
public const
{ @abstract(Defines the default format string used by the @link(TLoggerProFileAppender).)
The positional parameters are the followings:
@orderedList(
@itemSetNumber 0
@item TimeStamp
@item ThreadID
@item LogType
@item LogMessage
@item LogTag
)
}
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';
public
constructor Create(aLB: TListBox; aMaxLogLines: Word = 500; aLogFormat: string = DEFAULT_LOG_FORMAT); reintroduce;
procedure Setup; override;
procedure TearDown; override;
@ -44,14 +31,14 @@ uses
constructor TVCLListBoxAppender.Create(aLB: TListBox; aMaxLogLines: Word; aLogFormat: string);
begin
inherited Create;
FLogFormat := aLogFormat;
inherited Create(aLogFormat);
FLB := aLB;
FMaxLogLines := aMaxLogLines;
end;
procedure TVCLListBoxAppender.Setup;
begin
inherited;
TThread.Synchronize(nil,
procedure
begin
@ -68,8 +55,8 @@ procedure TVCLListBoxAppender.WriteLog(const aLogItem: TLogItem);
var
lText: string;
begin
lText := Format(FLogFormat, [datetimetostr(aLogItem.TimeStamp), aLogItem.ThreadID, aLogItem.LogTypeAsString,
aLogItem.LogMessage, aLogItem.LogTag]);
lText := FormatLog(aLogItem);
TThread.Queue(nil,
procedure
var

View File

@ -15,20 +15,7 @@ type
private
FLV: TListView;
FMaxLogLines: Word;
FLogFormat: string;
public const
{ @abstract(Defines the default format string used by the @link(TLoggerProFileAppender).)
The positional parameters are the followings:
@orderedList(
@itemSetNumber 0
@item TimeStamp
@item ThreadID
@item LogType
@item LogMessage
@item LogTag
)
}
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';
public
constructor Create(aLV: TListView; aMaxLogLines: Word = 500; aLogFormat: string = DEFAULT_LOG_FORMAT); reintroduce;
procedure Setup; override;
procedure TearDown; override;
@ -46,14 +33,14 @@ uses
constructor TVCLListViewAppender.Create(aLV: TListView; aMaxLogLines: Word; aLogFormat: string);
begin
inherited Create;
FLogFormat := aLogFormat;
inherited Create(aLogFormat);
FLV := aLV;
FMaxLogLines := aMaxLogLines;
end;
procedure TVCLListViewAppender.Setup;
begin
inherited;
TThread.Synchronize(nil,
procedure
begin
@ -70,8 +57,8 @@ procedure TVCLListViewAppender.WriteLog(const aLogItem: TLogItem);
var
lText: string;
begin
lText := Format(FLogFormat, [datetimetostr(aLogItem.TimeStamp), aLogItem.ThreadID, aLogItem.LogTypeAsString,
aLogItem.LogMessage, aLogItem.LogTag]);
lText := FormatLog(aLogItem);
TThread.Queue(nil,
procedure
var

View File

@ -17,7 +17,7 @@ type
FMaxLogLines: Word;
FClearOnStartup: Boolean;
public
constructor Create(aMemo: TMemo; aMaxLogLines: Word = 100; aClearOnStartup: Boolean = False); reintroduce;
constructor Create(aMemo: TMemo; aMaxLogLines: Word = 100; aClearOnStartup: Boolean = False; aLogFormat: string = DEFAULT_LOG_FORMAT); reintroduce;
procedure Setup; override;
procedure TearDown; override;
procedure WriteLog(const aLogItem: TLogItem); override;
@ -30,14 +30,11 @@ uses
Winapi.Windows,
Winapi.Messages;
const
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';
{ TVCLMemoLogAppender }
{ TVCLMemoLogAppender }
constructor TVCLMemoLogAppender.Create(aMemo: TMemo; aMaxLogLines: Word; aClearOnStartup: Boolean);
constructor TVCLMemoLogAppender.Create(aMemo: TMemo; aMaxLogLines: Word; aClearOnStartup: Boolean; aLogFormat: string);
begin
inherited Create;
inherited Create(aLogFormat);
FMemo := aMemo;
FMaxLogLines := aMaxLogLines;
FClearOnStartup := aClearOnStartup;
@ -45,6 +42,7 @@ end;
procedure TVCLMemoLogAppender.Setup;
begin
inherited;
if FClearOnStartup then
begin
TThread.Synchronize(nil,
@ -64,8 +62,12 @@ procedure TVCLMemoLogAppender.WriteLog(const aLogItem: TLogItem);
var
lText: string;
begin
lText := Format(DEFAULT_LOG_FORMAT, [datetimetostr(aLogItem.TimeStamp), aLogItem.ThreadID, aLogItem.LogTypeAsString, aLogItem.LogMessage,
aLogItem.LogTag]);
if Assigned(FMemo) then
begin
if FMemo.owner = nil then exit;
end;
lText := FormatLog(aLogItem);
TThread.Queue(nil,
procedure
begin

View File

@ -12,6 +12,20 @@ uses
System.Classes,
ThreadSafeQueueU;
const
{ @abstract(Defines the default format string used by the @link(TLoggerProAppenderBase).)
The positional parameters are the followings:
@orderedList(
@itemSetNumber 0
@item TimeStamp
@item ThreadID
@item LogType
@item LogMessage
@item LogTag
)
}
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';
var
DefaultLoggerProMainQueueSize: Cardinal = 50000;
DefaultLoggerProAppenderQueueSize: Cardinal = 50000;
@ -107,7 +121,20 @@ type
TAppenderQueue = class(TThreadSafeQueue<TLogItem>)
end;
ILogWriter = interface
ICustomLogWriter = interface
['{8BC2F462-E2A3-4117-BE1F-03EB31997BB4}']
function GetAppendersClassNames: TArray<string>;
function GetAppenders(const aIndex: Integer): ILogAppender;
property Appenders[const aIndex: Integer]: ILogAppender read GetAppenders;
procedure AddAppender(const aAppenders: ILogAppender);
procedure DelAppender(const aAppenders: ILogAppender);
function AppendersCount(): Integer;
// Base logging method
procedure Log(const aType: TLogType; const aMessage: string; const aTag: string); overload;
end;
ILogWriter = interface(ICustomLogWriter)
['{A717A040-4493-458F-91B2-6F6E2AFB496F}']
procedure Debug(const aMessage: string; const aTag: string); overload;
procedure Debug(const aMessage: string; const aParams: array of TVarRec; const aTag: string); overload;
@ -128,13 +155,6 @@ type
procedure Log(const aType: TLogType; const aMessage: string; const aTag: string); overload;
procedure Log(const aType: TLogType; const aMessage: string; const aParams: array of const; const aTag: string); overload;
procedure LogFmt(const aType: TLogType; const aMessage: string; const aParams: array of const; const aTag: string); deprecated;
function GetAppendersClassNames: TArray<string>;
function GetAppenders(const Index: Integer): ILogAppender;
property Appenders[const index: Integer]: ILogAppender read GetAppenders;
procedure AddAppender(const aAppenders: ILogAppender);
procedure DelAppender(const aAppenders: ILogAppender);
function AppendersCount(): Integer;
end;
TLogAppenderList = TList<ILogAppender>;
@ -203,22 +223,32 @@ type
function _Release: Integer; stdcall;
end;
TLogWriter = class(TLoggerProInterfacedObject, ILogWriter)
private
TCustomLogWriter = class(TLoggerProInterfacedObject, ICustomLogWriter)
strict private
FLoggerThread: TLoggerThread;
FLogAppenders: TLogAppenderList;
FFreeAllowed: Boolean;
FLogLevel: TLogType;
procedure Initialize(aEventsHandler: TLoggerProEventsHandler);
function GetAppendersClassNames: TArray<string>;
protected
procedure Initialize(const aEventsHandler: TLoggerProEventsHandler);
public
function GetAppenders(const Index: Integer): ILogAppender;
constructor Create(const aLogLevel: TLogType = TLogType.Debug); overload;
constructor Create(const aLogAppenders: TLogAppenderList; const aLogLevel: TLogType = TLogType.Debug); overload;
destructor Destroy; override;
function GetAppenders(const aIndex: Integer): ILogAppender;
procedure AddAppender(const aAppender: ILogAppender);
procedure DelAppender(const aAppender: ILogAppender);
function AppendersCount(): Integer;
constructor Create(aLogLevel: TLogType = TLogType.Debug); overload;
constructor Create(aLogAppenders: TLogAppenderList; aLogLevel: TLogType = TLogType.Debug); overload;
destructor Destroy; override;
procedure Log(const aType: TLogType; const aMessage: string; const aTag: string); overload;
end;
TLogWriter = class(TCustomLogWriter, ILogWriter)
private
protected
public
procedure Debug(const aMessage: string; const aTag: string); overload;
procedure Debug(const aMessage: string; const aParams: array of TVarRec; const aTag: string); overload;
procedure DebugFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
@ -235,19 +265,27 @@ type
procedure Error(const aMessage: string; const aParams: array of TVarRec; const aTag: string); overload;
procedure ErrorFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
procedure Log(const aType: TLogType; const aMessage: string; const aTag: string); overload;
procedure Log(const aType: TLogType; const aMessage: string; const aParams: array of const; const aTag: string); overload;
procedure LogFmt(const aType: TLogType; const aMessage: string; const aParams: array of const; const aTag: string);
end;
TOnAppenderLogRow = reference to procedure(const LogItem: TLogItem; out LogRow: string);
TLoggerProAppenderBase = class abstract(TInterfacedObject, ILogAppender)
private
FLogLevel: TLogType;
FEnabled: Boolean;
FLastErrorTimeStamp: TDateTime;
FOnLogRow: TOnAppenderLogRow;
FLogFormat: string;
FFormatSettings: TFormatSettings;
protected
property LogFormat: string read FLogFormat;
property FormatSettings: TFormatSettings read FFormatSettings;
public
constructor Create; virtual;
procedure Setup; virtual; abstract;
constructor Create(ALogFormat: string = DEFAULT_LOG_FORMAT); virtual;
procedure Setup; virtual;
function FormatLog(const ALogItem: TLogItem): string; virtual;
procedure WriteLog(const aLogItem: TLogItem); virtual; abstract;
procedure TearDown; virtual; abstract;
procedure TryToRestart(var Restarted: Boolean); virtual;
@ -256,6 +294,7 @@ type
procedure SetLastErrorTimeStamp(const Value: TDateTime);
function GetLastErrorTimeStamp: TDateTime;
property LogLevel: TLogType read GetLogLevel write SetLogLevel;
property OnLogRow: TOnAppenderLogRow read FOnLogRow write FOnLogRow;
end;
{ @abstract(Builds a new ILogWriter instance. Call this global function to start logging like a pro.)
@ -353,78 +392,50 @@ begin
TLogWriter(Result).Initialize(aEventsHandlers);
end;
{ TLogger.TLogWriter }
{ TLogger.TCustomLogWriter }
function TLogWriter.AppendersCount: Integer;
function TCustomLogWriter.AppendersCount: Integer;
begin
Result := Self.FLogAppenders.Count;
end;
constructor TLogWriter.Create(aLogAppenders: TLogAppenderList; aLogLevel: TLogType);
constructor TCustomLogWriter.Create(const aLogAppenders: TLogAppenderList; const aLogLevel: TLogType = TLogType.Debug);
begin
inherited Create;
FFreeAllowed := False;
FLogAppenders := aLogAppenders;
FLogLevel := aLogLevel;
end;
constructor TLogWriter.Create(aLogLevel: TLogType);
constructor TCustomLogWriter.Create(const aLogLevel: TLogType = TLogType.Debug);
begin
Create(TLogAppenderList.Create, aLogLevel);
end;
procedure TLogWriter.Debug(const aMessage, aTag: string);
begin
Log(TLogType.Debug, aMessage, aTag);
end;
procedure TLogWriter.Debug(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Log(TLogType.Debug, aMessage, aParams, aTag);
end;
procedure TLogWriter.DebugFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Debug(aMessage, aParams, aTag);
end;
destructor TLogWriter.Destroy;
destructor TCustomLogWriter.Destroy;
begin
FLoggerThread.Terminate;
FLoggerThread.WaitFor;
FLoggerThread.Free;
FLogAppenders.Free;
inherited;
inherited Destroy;
end;
procedure TLogWriter.Error(const aMessage, aTag: string);
function TCustomLogWriter.GetAppenders(const aIndex: Integer): ILogAppender;
begin
Log(TLogType.Error, aMessage, aTag);
Result := Self.FLogAppenders[aIndex];
end;
procedure TLogWriter.Error(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Log(TLogType.Error, aMessage, aParams, aTag);
end;
procedure TLogWriter.ErrorFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Error(aMessage, aParams, aTag);
end;
function TLogWriter.GetAppenders(const Index: Integer): ILogAppender;
begin
Result := Self.FLogAppenders[index];
end;
procedure TLogWriter.AddAppender(const aAppender: ILogAppender);
procedure TCustomLogWriter.AddAppender(const aAppender: ILogAppender);
begin
Self.FLoggerThread.FAppenders.Add(aAppender);
Self.FLogAppenders.Add(aAppender);
Self.FLoggerThread.FAppendersDecorators.Add(TLoggerThread.TAppenderAdapter.Create(aAppender));
end;
procedure TLogWriter.DelAppender(const aAppender: ILogAppender);
procedure TCustomLogWriter.DelAppender(const aAppender: ILogAppender);
var
i: Integer;
begin
@ -436,12 +447,12 @@ begin
if i >= 0 then
Self.FLogAppenders.Delete(i);
for I := 0 to Self.FLoggerThread.FAppendersDecorators.Count - 1 do
for i := 0 to Self.FLoggerThread.FAppendersDecorators.Count - 1 do
if Self.FLoggerThread.FAppendersDecorators[i].FLogAppender = aAppender then
Self.FLoggerThread.FAppendersDecorators.Delete(i);
end;
function TLogWriter.GetAppendersClassNames: TArray<string>;
function TCustomLogWriter.GetAppendersClassNames: TArray<string>;
var
I: Cardinal;
begin
@ -457,22 +468,15 @@ begin
end;
end;
procedure TLogWriter.Info(const aMessage, aTag: string);
procedure TCustomLogWriter.Initialize(const aEventsHandler: TLoggerProEventsHandler);
begin
Log(TLogType.Info, aMessage, aTag);
FLoggerThread := TLoggerThread.Create(FLogAppenders);
FLoggerThread.EventsHandlers := aEventsHandler;
FLoggerThread.Start;
end;
procedure TLogWriter.Info(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Log(TLogType.Info, aMessage, aParams, aTag);
end;
procedure TLogWriter.InfoFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Info(aMessage, aParams, aTag);
end;
procedure TLogWriter.Log(const aType: TLogType; const aMessage, aTag: string);
procedure TCustomLogWriter.Log(const aType: TLogType; const aMessage, aTag: string);
var
lLogItem: TLogItem;
begin
@ -492,6 +496,53 @@ begin
end;
end;
{ TLogger.TLogWriter }
procedure TLogWriter.Debug(const aMessage, aTag: string);
begin
Log(TLogType.Debug, aMessage, aTag);
end;
procedure TLogWriter.Debug(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Log(TLogType.Debug, aMessage, aParams, aTag);
end;
procedure TLogWriter.DebugFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Debug(aMessage, aParams, aTag);
end;
procedure TLogWriter.Error(const aMessage, aTag: string);
begin
Log(TLogType.Error, aMessage, aTag);
end;
procedure TLogWriter.Error(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Log(TLogType.Error, aMessage, aParams, aTag);
end;
procedure TLogWriter.ErrorFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Error(aMessage, aParams, aTag);
end;
procedure TLogWriter.Info(const aMessage, aTag: string);
begin
Log(TLogType.Info, aMessage, aTag);
end;
procedure TLogWriter.Info(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Log(TLogType.Info, aMessage, aParams, aTag);
end;
procedure TLogWriter.InfoFmt(const aMessage: string; const aParams: array of TVarRec; const aTag: string);
begin
Info(aMessage, aParams, aTag);
end;
procedure TLogWriter.Log(const aType: TLogType; const aMessage: string; const aParams: array of const; const aTag: string);
begin
Log(aType, Format(aMessage, aParams), aTag);
@ -502,12 +553,6 @@ begin
Log(aType, aMessage, aParams, aTag);
end;
procedure TLogWriter.Initialize(aEventsHandler: TLoggerProEventsHandler);
begin
FLoggerThread := TLoggerThread.Create(FLogAppenders);
FLoggerThread.EventsHandlers := aEventsHandler;
FLoggerThread.Start;
end;
procedure TLogWriter.Warn(const aMessage, aTag: string);
begin
@ -720,11 +765,22 @@ end;
{ TLoggerProAppenderBase }
constructor TLoggerProAppenderBase.Create;
constructor TLoggerProAppenderBase.Create(ALogFormat: string);
begin
inherited;
inherited Create;
Self.FEnabled := true;
Self.FLogLevel := TLogType.Debug;
Self.FLogFormat := ALogFormat;
Self.FOnLogRow := nil;
end;
function TLoggerProAppenderBase.FormatLog(const ALogItem: TLogItem): string;
begin
if Assigned(FOnLogRow) then
FOnLogRow(ALogItem, Result)
else
Result := Format(FLogFormat, [DateTimeToStr(ALogItem.TimeStamp, FFormatSettings),
ALogItem.ThreadID, ALogItem.LogTypeAsString, ALogItem.LogMessage, ALogItem.LogTag]);
end;
function TLoggerProAppenderBase.GetLastErrorTimeStamp: TDateTime;
@ -747,6 +803,11 @@ begin
FLogLevel := Value;
end;
procedure TLoggerProAppenderBase.Setup;
begin
FFormatSettings := LoggerPro.GetDefaultFormatSettings;
end;
procedure TLoggerProAppenderBase.TryToRestart(var Restarted: Boolean);
begin
Restarted := False;

View File

@ -20,6 +20,19 @@ LoggerPro is compatibile with
- Delphi XE2
## What's new in 1.4.0
- Improved VCL and FMX visual appenders
- Appenders can be added and removed programmatically
- Added packages for latest versions of Delphi
- Improved algorithm used to handle slow consumers
- Added [DMSContainer's EventStreams](http://dmscontainer.bittimeprofessionals.com/) Appender
- Added very basic console appender that assumes is running from console in order to provide simple Linux console logging
- FIX [Issue 50](https://github.com/danieleteti/loggerpro/issues/50)
- New filtering log file appender that allows to pick individual tags to be written into a file.
- FIX [Issue 57](https://github.com/danieleteti/loggerpro/issues/57)
- FIX [Issue 60](https://github.com/danieleteti/loggerpro/issues/60)
## What's new in 1.3.2
- Added support for Android API level 26 in mobile demo

View File

@ -1,2 +1,2 @@
VERSION 1_3_3
BUILD DATETIME 2020-05-14T19:08:39.337540
VERSION 1.4.3
BUILD DATETIME : 2022-08-05T14:24:36.571140

View File

@ -1,84 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Classes, Interfaces, Objects and Records</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Classes, Interfaces, Objects and Records</h1>
<table class="itemstable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemunit">Unit</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.ELoggerPro.html">ELoggerPro</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.ILogAppender.html">ILogAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>Interface implemented by all the classes used as appenders</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.ILogWriter.html">ILogWriter</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html">TLoggerProConsoleAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.ConsoleAppender.html">LoggerPro.ConsoleAppender</a></td>
<td class="itemdesc"><p>Logs to the console using 4 different colors for the different logs level</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.TLoggerProEventsHandler.html">TLoggerProEventsHandler</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.TLoggerProFileAppender.html">TLoggerProFileAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>The default file appender</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html">TLoggerProOutputDebugStringAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.OutputDebugStringAppender.html">LoggerPro.OutputDebugStringAppender</a></td>
<td class="itemdesc"><p>This appenders sends logs to the <code>OutputDebugString</code> function on Windows OSes</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.TLoggerThread.html">TLoggerThread</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.TLogItem.html">TLogItem</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>Represent the single log item</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.TLogWriter.html">TLogWriter</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html">TVCLMemoLogAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.VCLMemoAppender.html">LoggerPro.VCLMemoAppender</a></td>
<td class="itemdesc"><p>Appends formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TMemo in a VCL application</p></td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,19 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Constants</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Constants</h1>
<p>
The units do not contain any constants.</p>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,39 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Functions and Procedures</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Functions and Procedures</h1>
<table class="itemstable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemunit">Unit</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#BuildLogWriter">BuildLogWriter</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>Builds a new ILogWriter instance. Call this global function to start logging like a pro.</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.GlobalLogger.html#Log">Log</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.GlobalLogger.html">LoggerPro.GlobalLogger</a></td>
<td class="itemdesc"><p>The global logger. Just uses <code>Logger.GlobalLogger</code> and you can start to log using <code>Log</code> function.</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.GlobalLogger.html#ReleaseGlobalLogger">ReleaseGlobalLogger</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.GlobalLogger.html">LoggerPro.GlobalLogger</a></td>
<td class="itemdesc"><p>Use only inside DLL because dll unloading is not a safe place to shutdown threads, so call this before unload DLL</p></td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,144 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Identifiers</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Identifiers</h1>
<table class="itemstable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemunit">Unit</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#BuildLogWriter">BuildLogWriter</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>Builds a new ILogWriter instance. Call this global function to start logging like a pro.</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.html#DefaultLoggerProAppenderQueueSize">DefaultLoggerProAppenderQueueSize</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#DefaultLoggerProMainQueueSize">DefaultLoggerProMainQueueSize</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.ELoggerPro.html">ELoggerPro</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.ILogAppender.html">ILogAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>Interface implemented by all the classes used as appenders</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.ILogWriter.html">ILogWriter</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.GlobalLogger.html#Log">Log</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.GlobalLogger.html">LoggerPro.GlobalLogger</a></td>
<td class="itemdesc"><p>The global logger. Just uses <code>Logger.GlobalLogger</code> and you can start to log using <code>Log</code> function.</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.GlobalLogger.html#ReleaseGlobalLogger">ReleaseGlobalLogger</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.GlobalLogger.html">LoggerPro.GlobalLogger</a></td>
<td class="itemdesc"><p>Use only inside DLL because dll unloading is not a safe place to shutdown threads, so call this before unload DLL</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.html#TFileAppenderOption">TFileAppenderOption</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>Logs to file using one different file for each different TAG used.</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.html#TFileAppenderOptions">TFileAppenderOptions</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogAppenderList">TLogAppenderList</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogErrorAction">TLogErrorAction</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogErrorReason">TLogErrorReason</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLoggerProAppenderErrorEvent">TLoggerProAppenderErrorEvent</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html">TLoggerProConsoleAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.ConsoleAppender.html">LoggerPro.ConsoleAppender</a></td>
<td class="itemdesc"><p>Logs to the console using 4 different colors for the different logs level</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.TLoggerProEventsHandler.html">TLoggerProEventsHandler</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.TLoggerProFileAppender.html">TLoggerProFileAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>The default file appender</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html">TLoggerProOutputDebugStringAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.OutputDebugStringAppender.html">LoggerPro.OutputDebugStringAppender</a></td>
<td class="itemdesc"><p>This appenders sends logs to the <code>OutputDebugString</code> function on Windows OSes</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.TLoggerThread.html">TLoggerThread</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.TLogItem.html">TLogItem</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>Represent the single log item</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogType">TLogType</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.TLogWriter.html">TLogWriter</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html">TVCLMemoLogAppender</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.VCLMemoAppender.html">LoggerPro.VCLMemoAppender</a></td>
<td class="itemdesc"><p>Appends formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TMemo in a VCL application</p></td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,59 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Types</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Types</h1>
<table class="itemstable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemunit">Unit</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.html#TFileAppenderOption">TFileAppenderOption</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>Logs to file using one different file for each different TAG used.</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.html#TFileAppenderOptions">TFileAppenderOptions</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogAppenderList">TLogAppenderList</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogErrorAction">TLogErrorAction</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogErrorReason">TLogErrorReason</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLoggerProAppenderErrorEvent">TLoggerProAppenderErrorEvent</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#TLogType">TLogType</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,47 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Units</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Units</h1>
<table class="unitstable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.ConsoleAppender.html">LoggerPro.ConsoleAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.GlobalLogger.html">LoggerPro.GlobalLogger</a></td>
<td class="itemdesc"><p>Contains the global logger as a thread safe singleton</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.OutputDebugStringAppender.html">LoggerPro.OutputDebugStringAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.VCLMemoAppender.html">LoggerPro.VCLMemoAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,34 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Variables</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Variables</h1>
<table class="itemstable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemunit">Unit</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html#DefaultLoggerProAppenderQueueSize">DefaultLoggerProAppenderQueueSize</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.html#DefaultLoggerProMainQueueSize">DefaultLoggerProMainQueueSize</a></td>
<td class="itemunit"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,37 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: Class Hierarchy</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">Class Hierarchy</h1>
<ul class="hierarchylevel">
<li>IInterface<ul class="hierarchylevel">
<li><a class="bold" href="LoggerPro.ILogAppender.html">ILogAppender</a><li><a class="bold" href="LoggerPro.ILogWriter.html">ILogWriter</a></ul>
</li>
<li>TInterfacedObject<ul class="hierarchylevel">
<li><a class="bold" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a><ul class="hierarchylevel">
<li><a class="bold" href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html">TLoggerProConsoleAppender</a><li><a class="bold" href="LoggerPro.FileAppender.TLoggerProFileAppender.html">TLoggerProFileAppender</a><li><a class="bold" href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html">TLoggerProOutputDebugStringAppender</a><li><a class="bold" href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html">TVCLMemoLogAppender</a></ul>
</li>
<li><a class="bold" href="LoggerPro.TLogWriter.html">TLogWriter</a></ul>
</li>
<li>TObject<ul class="hierarchylevel">
<li>Exception<ul class="hierarchylevel">
<li><a class="bold" href="LoggerPro.ELoggerPro.html">ELoggerPro</a></ul>
</li>
<li><a class="bold" href="LoggerPro.TLoggerProEventsHandler.html">TLoggerProEventsHandler</a><li><a class="bold" href="LoggerPro.TLogItem.html">TLogItem</a><li>TThread<ul class="hierarchylevel">
<li><a class="bold" href="LoggerPro.TLoggerThread.html">TLoggerThread</a></ul>
</li>
</ul>
</li>
</ul>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,92 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.ConsoleAppender: Class TLoggerProConsoleAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TLoggerProConsoleAppender"></a><h1 class="cio">Class TLoggerProConsoleAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.ConsoleAppender.html">LoggerPro.ConsoleAppender</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLoggerProConsoleAppender = class(<a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a>)</code></p>
<h2 class="description">Description</h2>
<p>
Logs to the console using 4 different colors for the different logs level</p>
<p>
To learn how to use this appender, check the sample <code>console_appender.dproj</code> </p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TInterfacedObject</li>
<li class="ancestor"><a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a></li>
<li class="thisitem">TLoggerProConsoleAppender</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html#Create">Create</a></b>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html#Setup">Setup</a></b>; override;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html#TearDown">TearDown</a></b>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html#WriteLog">WriteLog</a></b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); override;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Setup"></a><code>procedure <b>Setup</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TearDown"></a><code>procedure <b>TearDown</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WriteLog"></a><code>procedure <b>WriteLog</b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<h2 class="authors">Author</h2>
<ul class="authors">
<li>Daniele Teti - <a href="mailto:d.teti@bittime.it">d.teti@bittime.it</a></li>
</ul>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,34 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.ConsoleAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="unit">Unit LoggerPro.ConsoleAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td><a class="section" href="#PasDoc-Classes">Classes, Interfaces, Objects and Records</a></td><td>Functions and Procedures</td><td>Types</td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
&nbsp;<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a href="LoggerPro.html">LoggerPro</a></li><li>System.Classes</li><li>Vcl.StdCtrls</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Classes"></a><h3 class="cio">Classes, Interfaces, Objects and Records</h3>
<table class="classestable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.ConsoleAppender.TLoggerProConsoleAppender.html"><code>TLoggerProConsoleAppender</code></a></td>
<td class="itemdesc">Logs to the console using 4 different colors for the different logs level</td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,29 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Class ELoggerPro</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="ELoggerPro"></a><h1 class="cio">Class ELoggerPro</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td>Methods</td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type ELoggerPro = class(Exception)</code></p>
<h2 class="description">Description</h2>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">Exception</li>
<li class="thisitem">ELoggerPro</li></ul>Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,148 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.FileAppender: Class TLoggerProFileAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TLoggerProFileAppender"></a><h1 class="cio">Class TLoggerProFileAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td><a class="section" href="#PasDoc-Fields">Fields</a></td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLoggerProFileAppender = class(<a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a>)</code></p>
<h2 class="description">Description</h2>
<p>
The default file appender</p>
<p>
To learn how to use this appender, check the sample <code>file_appender.dproj</code></p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TInterfacedObject</li>
<li class="ancestor"><a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a></li>
<li class="thisitem">TLoggerProFileAppender</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Fields"></a><h3 class="summary">Fields</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>internal const <b><a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_LOG_FORMAT">DEFAULT_LOG_FORMAT</a></b> = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>internal const <b><a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_MAX_BACKUP_FILE_COUNT">DEFAULT_MAX_BACKUP_FILE_COUNT</a></b> = 5;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>internal const <b><a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_MAX_FILE_SIZE_KB">DEFAULT_MAX_FILE_SIZE_KB</a></b> = 1000;</code></td>
</tr>
</table>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#Create">Create</a></b>(aMaxBackupFileCount : Integer = <a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_MAX_BACKUP_FILE_COUNT">DEFAULT_MAX_BACKUP_FILE_COUNT</a>; aMaxFileSizeInKiloByte: Integer = <a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_MAX_FILE_SIZE_KB">DEFAULT_MAX_FILE_SIZE_KB</a>; aLogsFolder: string = ''; aFileAppenderOptions: <a href="LoggerPro.FileAppender.html#TFileAppenderOptions">TFileAppenderOptions</a> = []; aLogFormat: string = <a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_LOG_FORMAT">DEFAULT_LOG_FORMAT</a>); reintroduce;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#Setup">Setup</a></b>; override;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#TearDown">TearDown</a></b>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#WriteLog">WriteLog</a></b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); overload; override;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Fields</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="DEFAULT_LOG_FORMAT"></a><code>internal const <b>DEFAULT_LOG_FORMAT</b> = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';</code></td>
</tr>
<tr><td colspan="2">
<p>
Defines the default format string used by the <a class="normal" href="LoggerPro.FileAppender.TLoggerProFileAppender.html">TLoggerProFileAppender</a>.</p>
<p>
The positional parameters are the followings: </p>
<ol class="paragraph_spacing">
<li value="0"><p>TimeStamp</p></li>
<li value="1"><p>ThreadID</p></li>
<li value="2"><p>LogType</p></li>
<li value="3"><p>LogMessage</p></li>
<li value="4"><p>LogTag</p></li>
</ol>
<p></p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="DEFAULT_MAX_BACKUP_FILE_COUNT"></a><code>internal const <b>DEFAULT_MAX_BACKUP_FILE_COUNT</b> = 5;</code></td>
</tr>
<tr><td colspan="2">
<p>
Defines number of log file set to mantain during logs rotation</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="DEFAULT_MAX_FILE_SIZE_KB"></a><code>internal const <b>DEFAULT_MAX_FILE_SIZE_KB</b> = 1000;</code></td>
</tr>
<tr><td colspan="2">
<p>
Defines the max size of each log file</p>
<p>
The actual meaning is: &quot;If the file size is &gt; than <a class="normal" href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_MAX_FILE_SIZE_KB">DEFAULT_MAX_FILE_SIZE_KB</a> then rotate logs.</p>
</td></tr>
</table>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aMaxBackupFileCount : Integer = <a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_MAX_BACKUP_FILE_COUNT">DEFAULT_MAX_BACKUP_FILE_COUNT</a>; aMaxFileSizeInKiloByte: Integer = <a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_MAX_FILE_SIZE_KB">DEFAULT_MAX_FILE_SIZE_KB</a>; aLogsFolder: string = ''; aFileAppenderOptions: <a href="LoggerPro.FileAppender.html#TFileAppenderOptions">TFileAppenderOptions</a> = []; aLogFormat: string = <a href="LoggerPro.FileAppender.TLoggerProFileAppender.html#DEFAULT_LOG_FORMAT">DEFAULT_LOG_FORMAT</a>); reintroduce;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Setup"></a><code>procedure <b>Setup</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TearDown"></a><code>procedure <b>TearDown</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WriteLog"></a><code>procedure <b>WriteLog</b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); overload; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,87 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.FileAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="unit">Unit LoggerPro.FileAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td><a class="section" href="#PasDoc-Classes">Classes, Interfaces, Objects and Records</a></td><td>Functions and Procedures</td><td><a class="section" href="#PasDoc-Types">Types</a></td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
&nbsp;<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a href="LoggerPro.html">LoggerPro</a></li><li>System.Classes</li><li>System.SysUtils</li><li>System.Generics.Collections</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Classes"></a><h3 class="cio">Classes, Interfaces, Objects and Records</h3>
<table class="classestable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.FileAppender.TLoggerProFileAppender.html"><code>TLoggerProFileAppender</code></a></td>
<td class="itemdesc">The default file appender</td>
</tr>
</table>
<a name="PasDoc-Types"></a><h3 class="summary">Types</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a href="LoggerPro.FileAppender.html#TFileAppenderOption">TFileAppenderOption</a></b> = (...);</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a href="LoggerPro.FileAppender.html#TFileAppenderOptions">TFileAppenderOptions</a></b> = set of <a href="LoggerPro.FileAppender.html#TFileAppenderOption">TFileAppenderOption</a>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Types</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TFileAppenderOption"></a><code><b>TFileAppenderOption</b> = (...);</code></td>
</tr>
<tr><td colspan="1">
<p>
Logs to file using one different file for each different TAG used.</p>
<p>
Implements log rotations. This appender is the default appender when no configuration is done on the <code>TLogger</code> class.
<p>Without any configuration LoggerPro uses the <a class="normal" href="LoggerPro.FileAppender.TLoggerProFileAppender.html">TLoggerProFileAppender</a> with the default configuration.
<p>So the following two blocks of code are equivalent:
<p></p>
<pre class="longcode">
<span class="pascal_numeric"></span>...
TLogger.Initialize; <span class="pascal_comment">//=&gt; uses the TLoggerProFileAppender because no other configuration is provided</span>
<span class="pascal_numeric"></span>...
<span class="pascal_numeric"></span>...
TLogger.AddAppender(TLoggerProFileAppender.Create);
TLogger.Initialize <span class="pascal_comment">//=&gt; uses the TLoggerProFileAppender as configured</span>
<span class="pascal_numeric"></span>...
</pre>
<p></p>
<h6 class="description_section">Values</h6>
<ul>
<li>
IncludePID: &nbsp;</li>
</ul>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TFileAppenderOptions"></a><code><b>TFileAppenderOptions</b> = set of <a href="LoggerPro.FileAppender.html#TFileAppenderOption">TFileAppenderOption</a>;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,64 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.GlobalLogger</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="unit">Unit LoggerPro.GlobalLogger</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td>Classes, Interfaces, Objects and Records</td><td><a class="section" href="#PasDoc-FuncsProcs">Functions and Procedures</a></td><td>Types</td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
<p>
Contains the global logger as a thread safe singleton</p>
<p>
Use the global logger for fast&amp;dirty logging, but consider to use your own instance of <a class="normal" href="LoggerPro.ILogWriter.html">ILogWriter</a> (created using <a class="normal" href="LoggerPro.html#BuildLogWriter">BuildLogWriter</a>) for all your serious logging needs. </p>
<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a href="LoggerPro.html">LoggerPro</a></li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-FuncsProcs"></a><h3 class="summary">Functions and Procedures</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code>function <b><a href="LoggerPro.GlobalLogger.html#Log">Log</a></b>: <a href="LoggerPro.ILogWriter.html">ILogWriter</a>;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code>procedure <b><a href="LoggerPro.GlobalLogger.html#ReleaseGlobalLogger">ReleaseGlobalLogger</a></b>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Functions and Procedures</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="Log"></a><code>function <b>Log</b>: <a href="LoggerPro.ILogWriter.html">ILogWriter</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
The global logger. Just uses <code>Logger.GlobalLogger</code> and you can start to log using <code>Log</code> function.</p>
<p>
The global logger is configured with a <a class="normal" href="LoggerPro.FileAppender.TLoggerProFileAppender.html">TLoggerProFileAppender</a> using default settings.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="ReleaseGlobalLogger"></a><code>procedure <b>ReleaseGlobalLogger</b>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Use only inside DLL because dll unloading is not a safe place to shutdown threads, so call this before unload DLL</p>
<p>
Use this also in ISAPI dll. Check the <code>loggerproisapisample.dll</code> sample</p>
</td></tr>
</table>
<h2 class="authors">Author</h2>
<ul class="authors">
<li>Daniele Teti - <a href="mailto:d.teti@bittime.it">d.teti@bittime.it</a></li>
</ul>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,142 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Interface ILogAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="ILogAppender"></a><h1 class="cio">Interface ILogAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type ILogAppender = interface(IInterface)</code></p>
<h2 class="description">Description</h2>
<p>
Interface implemented by all the classes used as appenders</p>
<h6 class="description_section">Attributes</h6>
<dl class="attributes">
<dt>GUID['{58AFB557-C594-4A4B-8DC9-0F13B37F60CB}']</dt>
<dd></dd>
</dl>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">IInterface</li>
<li class="thisitem">ILogAppender</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogAppender.html#Setup">Setup</a></b>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogAppender.html#WriteLog">WriteLog</a></b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogAppender.html#TearDown">TearDown</a></b>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogAppender.html#SetEnabled">SetEnabled</a></b>(const Value: Boolean);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.ILogAppender.html#IsEnabled">IsEnabled</a></b>: Boolean;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogAppender.html#SetLogLevel">SetLogLevel</a></b>(const Value: <a href="LoggerPro.html#TLogType">TLogType</a>);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.ILogAppender.html#GetLogLevel">GetLogLevel</a></b>: <a href="LoggerPro.html#TLogType">TLogType</a>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Setup"></a><code>procedure <b>Setup</b>;</code></td>
</tr>
<tr><td colspan="2">
<p>
This method is internally called by LoggerPro to initialize the appender</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WriteLog"></a><code>procedure <b>WriteLog</b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>);</code></td>
</tr>
<tr><td colspan="2">
<p>
This method is called at each log item represented by <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a></p>
<p>
The appender should be as-fast-as-it-can to handle the message, however each appender runs in a separated thread.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TearDown"></a><code>procedure <b>TearDown</b>;</code></td>
</tr>
<tr><td colspan="2">
<p>
This method is internally called by LoggerPro to deinitialize the appender</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="SetEnabled"></a><code>procedure <b>SetEnabled</b>(const Value: Boolean);</code></td>
</tr>
<tr><td colspan="2">
<p>
(Enable or disable the log appender. Is used internally by LoggerPro but must be implemented by each logappender. A simple <code>if enabled then dolog</code> is enough</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="IsEnabled"></a><code>function <b>IsEnabled</b>: Boolean;</code></td>
</tr>
<tr><td colspan="2">
<p>
(Returns if the logappender is currently enabled or not.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="SetLogLevel"></a><code>procedure <b>SetLogLevel</b>(const Value: <a href="LoggerPro.html#TLogType">TLogType</a>);</code></td>
</tr>
<tr><td colspan="2">
<p>
(Set a custom log level for this appender. This value must be lower than the global LogWriter log level.</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="GetLogLevel"></a><code>function <b>GetLogLevel</b>: <a href="LoggerPro.html#TLogType">TLogType</a>;</code></td>
</tr>
<tr><td colspan="2">
<p>
(Get the loglevel for the appender.</p>
</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,212 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Interface ILogWriter</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="ILogWriter"></a><h1 class="cio">Interface ILogWriter</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td><a class="section" href="#PasDoc-Properties">Properties</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type ILogWriter = interface(IInterface)</code></p>
<h2 class="description">Description</h2>
<h6 class="description_section">Attributes</h6>
<dl class="attributes">
<dt>GUID['{A717A040-4493-458F-91B2-6F6E2AFB496F}']</dt>
<dd></dd>
</dl>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">IInterface</li>
<li class="thisitem">ILogWriter</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#Debug">Debug</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#DebugFmt">DebugFmt</a></b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#Info">Info</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#InfoFmt">InfoFmt</a></b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#Warn">Warn</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#WarnFmt">WarnFmt</a></b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#Error">Error</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#ErrorFmt">ErrorFmt</a></b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.ILogWriter.html#Log">Log</a></b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.ILogWriter.html#GetAppendersClassNames">GetAppendersClassNames</a></b>: TArray&lt;string&gt;;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.ILogWriter.html#GetAppenderStatus">GetAppenderStatus</a></b>(const AppenderName: string): string;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.ILogWriter.html#GetAppenders">GetAppenders</a></b>(const Index: Integer): <a href="LoggerPro.ILogAppender.html">ILogAppender</a>;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.ILogWriter.html#AppendersCount">AppendersCount</a></b>(): Integer;</code></td>
</tr>
</table>
<a name="PasDoc-Properties"></a><h3 class="summary">Properties</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.ILogWriter.html#Appenders">Appenders</a></b>[constindex:Integer]: <a href="LoggerPro.ILogAppender.html">ILogAppender</a> read <a href="LoggerPro.ILogWriter.html#GetAppenders">GetAppenders</a>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Debug"></a><code>procedure <b>Debug</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="DebugFmt"></a><code>procedure <b>DebugFmt</b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Info"></a><code>procedure <b>Info</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="InfoFmt"></a><code>procedure <b>InfoFmt</b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Warn"></a><code>procedure <b>Warn</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WarnFmt"></a><code>procedure <b>WarnFmt</b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Error"></a><code>procedure <b>Error</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="ErrorFmt"></a><code>procedure <b>ErrorFmt</b>(aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Log"></a><code>procedure <b>Log</b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="GetAppendersClassNames"></a><code>function <b>GetAppendersClassNames</b>: TArray&lt;string&gt;;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="GetAppenderStatus"></a><code>function <b>GetAppenderStatus</b>(const AppenderName: string): string;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="GetAppenders"></a><code>function <b>GetAppenders</b>(const Index: Integer): <a href="LoggerPro.ILogAppender.html">ILogAppender</a>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="AppendersCount"></a><code>function <b>AppendersCount</b>(): Integer;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<h3 class="detail">Properties</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Appenders"></a><code>property <b>Appenders</b>[constindex:Integer]: <a href="LoggerPro.ILogAppender.html">ILogAppender</a> read <a href="LoggerPro.ILogWriter.html#GetAppenders">GetAppenders</a>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,88 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.OutputDebugStringAppender: Class TLoggerProOutputDebugStringAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TLoggerProOutputDebugStringAppender"></a><h1 class="cio">Class TLoggerProOutputDebugStringAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.OutputDebugStringAppender.html">LoggerPro.OutputDebugStringAppender</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLoggerProOutputDebugStringAppender = class(<a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a>)</code></p>
<h2 class="description">Description</h2>
<p>
This appenders sends logs to the <code>OutputDebugString</code> function on Windows OSes</p>
<p>
To learn how to use this appender, check the sample <code>outputdebugstring_appender.dproj</code></p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TInterfacedObject</li>
<li class="ancestor"><a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a></li>
<li class="thisitem">TLoggerProOutputDebugStringAppender</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html#Create">Create</a></b>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html#Setup">Setup</a></b>; override;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html#TearDown">TearDown</a></b>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html#WriteLog">WriteLog</a></b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); override;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Setup"></a><code>procedure <b>Setup</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TearDown"></a><code>procedure <b>TearDown</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WriteLog"></a><code>procedure <b>WriteLog</b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,34 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.OutputDebugStringAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="unit">Unit LoggerPro.OutputDebugStringAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td><a class="section" href="#PasDoc-Classes">Classes, Interfaces, Objects and Records</a></td><td>Functions and Procedures</td><td>Types</td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
&nbsp;<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a href="LoggerPro.html">LoggerPro</a></li><li>System.Classes</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Classes"></a><h3 class="cio">Classes, Interfaces, Objects and Records</h3>
<table class="classestable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.OutputDebugStringAppender.TLoggerProOutputDebugStringAppender.html"><code>TLoggerProOutputDebugStringAppender</code></a></td>
<td class="itemdesc">This appenders sends logs to the <code>OutputDebugString</code> function on Windows OSes</td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,174 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Class TLogItem</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TLogItem"></a><h1 class="cio">Class TLogItem</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td><a class="section" href="#PasDoc-Properties">Properties</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLogItem = class sealed(TObject)</code></p>
<h2 class="description">Description</h2>
<p>
Represent the single log item</p>
<p>
Each call to some kind of log method is wrapped in a <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> instance and passed down the layour of LoggerPro.</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="thisitem">TLogItem</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.TLogItem.html#Create">Create</a></b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string); overload;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.TLogItem.html#Create">Create</a></b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string; aTimeStamp: TDateTime; aThreadID: Cardinal); overload;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.TLogItem.html#Clone">Clone</a></b>: <a href="LoggerPro.TLogItem.html">TLogItem</a>;</code></td>
</tr>
</table>
<a name="PasDoc-Properties"></a><h3 class="summary">Properties</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLogItem.html#LogType">LogType</a></b>: <a href="LoggerPro.html#TLogType">TLogType</a> read FType;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLogItem.html#LogMessage">LogMessage</a></b>: string read FMessage;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLogItem.html#LogTag">LogTag</a></b>: string read FTag;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLogItem.html#TimeStamp">TimeStamp</a></b>: TDateTime read FTimeStamp;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLogItem.html#ThreadID">ThreadID</a></b>: Cardinal read FThreadID;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLogItem.html#LogTypeAsString">LogTypeAsString</a></b>: string read GetLogTypeAsString;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string); overload;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string; aTimeStamp: TDateTime; aThreadID: Cardinal); overload;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Clone"></a><code>function <b>Clone</b>: <a href="LoggerPro.TLogItem.html">TLogItem</a>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<h3 class="detail">Properties</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="LogType"></a><code>property <b>LogType</b>: <a href="LoggerPro.html#TLogType">TLogType</a> read FType;</code></td>
</tr>
<tr><td colspan="2">
<p>
The type of the log</p>
<p>
Log can be one of the following types: </p>
<ul class="paragraph_spacing">
<li><p>DEBUG</p></li>
<li><p>INFO</p></li>
<li><p>WARNING</p></li>
<li><p>ERROR</p></li>
</ul>
<p></p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="LogMessage"></a><code>property <b>LogMessage</b>: string read FMessage;</code></td>
</tr>
<tr><td colspan="2">
<p>
The text of the log message</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="LogTag"></a><code>property <b>LogTag</b>: string read FTag;</code></td>
</tr>
<tr><td colspan="2">
<p>
The tag of the log message</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TimeStamp"></a><code>property <b>TimeStamp</b>: TDateTime read FTimeStamp;</code></td>
</tr>
<tr><td colspan="2">
<p>
The timestamp when the <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> is generated</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="ThreadID"></a><code>property <b>ThreadID</b>: Cardinal read FThreadID;</code></td>
</tr>
<tr><td colspan="2">
<p>
The IDof the thread which generated the log item</p>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="LogTypeAsString"></a><code>property <b>LogTypeAsString</b>: string read GetLogTypeAsString;</code></td>
</tr>
<tr><td colspan="2">
<p>
The type of the log converted in string</p>
</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,215 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Class TLogWriter</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TLogWriter"></a><h1 class="cio">Class TLogWriter</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLogWriter = class(TInterfacedObject, <a class="normal" href="LoggerPro.ILogWriter.html">ILogWriter</a>)</code></p>
<h2 class="description">Description</h2>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TInterfacedObject</li>
<li class="thisitem">TLogWriter</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.TLogWriter.html#GetAppenders">GetAppenders</a></b>(const Index: Integer): <a href="LoggerPro.ILogAppender.html">ILogAppender</a>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>function <b><a href="LoggerPro.TLogWriter.html#AppendersCount">AppendersCount</a></b>(): Integer;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.TLogWriter.html#Create">Create</a></b>(aLogLevel: <a href="LoggerPro.html#TLogType">TLogType</a> = TLogType.Debug); overload;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.TLogWriter.html#Create">Create</a></b>(aLogAppenders: <a href="LoggerPro.html#TLogAppenderList">TLogAppenderList</a>; aLogLevel: <a href="LoggerPro.html#TLogType">TLogType</a> = TLogType.Debug); overload;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>destructor <b><a href="LoggerPro.TLogWriter.html#Destroy">Destroy</a></b>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#Debug">Debug</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#DebugFmt">DebugFmt</a></b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#Info">Info</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#InfoFmt">InfoFmt</a></b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#Warn">Warn</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#WarnFmt">WarnFmt</a></b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#Error">Error</a></b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#ErrorFmt">ErrorFmt</a></b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#Log">Log</a></b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string);</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.TLogWriter.html#LogFmt">LogFmt</a></b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="GetAppenders"></a><code>function <b>GetAppenders</b>(const Index: Integer): <a href="LoggerPro.ILogAppender.html">ILogAppender</a>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="AppendersCount"></a><code>function <b>AppendersCount</b>(): Integer;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aLogLevel: <a href="LoggerPro.html#TLogType">TLogType</a> = TLogType.Debug); overload;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aLogAppenders: <a href="LoggerPro.html#TLogAppenderList">TLogAppenderList</a>; aLogLevel: <a href="LoggerPro.html#TLogType">TLogType</a> = TLogType.Debug); overload;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Destroy"></a><code>destructor <b>Destroy</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Debug"></a><code>procedure <b>Debug</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="DebugFmt"></a><code>procedure <b>DebugFmt</b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Info"></a><code>procedure <b>Info</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="InfoFmt"></a><code>procedure <b>InfoFmt</b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Warn"></a><code>procedure <b>Warn</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WarnFmt"></a><code>procedure <b>WarnFmt</b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Error"></a><code>procedure <b>Error</b>(aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="ErrorFmt"></a><code>procedure <b>ErrorFmt</b>(aMessage: string; aParams: array of TVarRec; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Log"></a><code>procedure <b>Log</b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="LogFmt"></a><code>procedure <b>LogFmt</b>(aType: <a href="LoggerPro.html#TLogType">TLogType</a>; aMessage: string; aParams: array of const; aTag: string);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,93 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Class TLogger</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (beta 1)</h2><p>A simple, pluggable and modern logging framework for Delphi</p><a name="TLogger"></a><h1 class="cio">Class TLogger</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLogger = class sealed(TObject)</code></p>
<h2 class="description">Description</h2>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="thisitem">TLogger</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>class constructor <b><a href="LoggerPro.TLogger.html#Create">Create</a></b>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>class destructor <b><a href="LoggerPro.TLogger.html#Destroy">Destroy</a></b>;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>class procedure <b><a href="LoggerPro.TLogger.html#AddAppender">AddAppender</a></b>(aILogAppender: <a href="LoggerPro.ILogAppender.html">ILogAppender</a>);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>class procedure <b><a href="LoggerPro.TLogger.html#Initialize">Initialize</a></b>;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>class procedure <b><a href="LoggerPro.TLogger.html#ResetAppenders">ResetAppenders</a></b>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>class constructor <b>Create</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Destroy"></a><code>class destructor <b>Destroy</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="AddAppender"></a><code>class procedure <b>AddAppender</b>(aILogAppender: <a href="LoggerPro.ILogAppender.html">ILogAppender</a>);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Initialize"></a><code>class procedure <b>Initialize</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="ResetAppenders"></a><code>class procedure <b>ResetAppenders</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,47 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Class TLoggerProEventsHandler</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TLoggerProEventsHandler"></a><h1 class="cio">Class TLoggerProEventsHandler</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td><a class="section" href="#PasDoc-Fields">Fields</a></td><td>Methods</td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLoggerProEventsHandler = class sealed(TObject)</code></p>
<h2 class="description">Description</h2>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TObject</li>
<li class="thisitem">TLoggerProEventsHandler</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Fields"></a><h3 class="summary">Fields</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code><b><a href="LoggerPro.TLoggerProEventsHandler.html#OnAppenderError">OnAppenderError</a></b>: <a href="LoggerPro.html#TLoggerProAppenderErrorEvent">TLoggerProAppenderErrorEvent</a>;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Fields</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="OnAppenderError"></a><code><b>OnAppenderError</b>: <a href="LoggerPro.html#TLoggerProAppenderErrorEvent">TLoggerProAppenderErrorEvent</a>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,89 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro: Class TLoggerThread</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TLoggerThread"></a><h1 class="cio">Class TLoggerThread</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td><a class="section" href="#PasDoc-Properties">Properties</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.html">LoggerPro</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TLoggerThread = class(TThread)</code></p>
<h2 class="description">Description</h2>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TThread</li>
<li class="thisitem">TLoggerThread</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.TLoggerThread.html#Create">Create</a></b>(aAppenders: <a href="LoggerPro.html#TLogAppenderList">TLogAppenderList</a>);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>destructor <b><a href="LoggerPro.TLoggerThread.html#Destroy">Destroy</a></b>; override;</code></td>
</tr>
</table>
<a name="PasDoc-Properties"></a><h3 class="summary">Properties</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLoggerThread.html#EventsHandlers">EventsHandlers</a></b>: <a href="LoggerPro.TLoggerProEventsHandler.html">TLoggerProEventsHandler</a> read FEventsHandlers
write SetEventsHandlers;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>property <b><a href="LoggerPro.TLoggerThread.html#LogWriterQueue">LogWriterQueue</a></b>: TThreadedQueue&lt;<a href="LoggerPro.TLogItem.html">TLogItem</a>&gt; read FQueue;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aAppenders: <a href="LoggerPro.html#TLogAppenderList">TLogAppenderList</a>);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Destroy"></a><code>destructor <b>Destroy</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<h3 class="detail">Properties</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="EventsHandlers"></a><code>property <b>EventsHandlers</b>: <a href="LoggerPro.TLoggerProEventsHandler.html">TLoggerProEventsHandler</a> read FEventsHandlers
write SetEventsHandlers;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="LogWriterQueue"></a><code>property <b>LogWriterQueue</b>: TThreadedQueue&lt;<a href="LoggerPro.TLogItem.html">TLogItem</a>&gt; read FQueue;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,83 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.VCLAppenders: Class TMemoLogAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (beta 1)</h2><p>A simple, pluggable and modern logging framework for Delphi</p><a name="TMemoLogAppender"></a><h1 class="cio">Class TMemoLogAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.VCLAppenders.html">LoggerPro.VCLAppenders</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TMemoLogAppender = class(TInterfacedObject, <a class="normal" href="LoggerPro.ILogAppender.html">ILogAppender</a>)</code></p>
<h2 class="description">Description</h2>
<p>
Logs appending formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TMemo</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TInterfacedObject</li>
<li class="thisitem">TMemoLogAppender</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.VCLAppenders.TMemoLogAppender.html#Create">Create</a></b>(aMemo: TMemo);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLAppenders.TMemoLogAppender.html#Setup">Setup</a></b>;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLAppenders.TMemoLogAppender.html#TearDown">TearDown</a></b>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLAppenders.TMemoLogAppender.html#WriteLog">WriteLog</a></b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>);</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aMemo: TMemo);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Setup"></a><code>procedure <b>Setup</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TearDown"></a><code>procedure <b>TearDown</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WriteLog"></a><code>procedure <b>WriteLog</b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,83 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.VCLAppenders: Class TStringsLogAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (beta 1)</h2><p>A simple, pluggable and modern logging framework for Delphi</p><a name="TStringsLogAppender"></a><h1 class="cio">Class TStringsLogAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.VCLAppenders.html">LoggerPro.VCLAppenders</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TStringsLogAppender = class(TInterfacedObject, <a class="normal" href="LoggerPro.ILogAppender.html">ILogAppender</a>)</code></p>
<h2 class="description">Description</h2>
<p>
Logs appending formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TStrings descendant</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TInterfacedObject</li>
<li class="thisitem">TStringsLogAppender</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.VCLAppenders.TStringsLogAppender.html#Create">Create</a></b>(aStrings: TStrings);</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLAppenders.TStringsLogAppender.html#Setup">Setup</a></b>;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLAppenders.TStringsLogAppender.html#TearDown">TearDown</a></b>;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLAppenders.TStringsLogAppender.html#WriteLog">WriteLog</a></b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>);</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aStrings: TStrings);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Setup"></a><code>procedure <b>Setup</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TearDown"></a><code>procedure <b>TearDown</b>;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WriteLog"></a><code>procedure <b>WriteLog</b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>);</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,44 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.VCLAppenders</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (beta 1)</h2><p>A simple, pluggable and modern logging framework for Delphi</p><h1 class="unit">Unit LoggerPro.VCLAppenders</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td><a class="section" href="#PasDoc-Classes">Classes, Interfaces, Objects and Records</a></td><td>Functions and Procedures</td><td>Types</td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
<p>
The unit to include if you want to use VCL appenders like <a class="normal" href="LoggerPro.VCLAppenders.TStringsLogAppender.html">TStringsLogAppender</a> or <a class="normal" href="LoggerPro.VCLAppenders.TMemoLogAppender.html">TMemoLogAppender</a></p>
<p>
</p>
<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a href="LoggerPro.html">LoggerPro</a></li><li>System.Classes</li><li>Vcl.StdCtrls</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Classes"></a><h3 class="cio">Classes, Interfaces, Objects and Records</h3>
<table class="classestable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.VCLAppenders.TStringsLogAppender.html"><code>TStringsLogAppender</code></a></td>
<td class="itemdesc">Logs appending formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TStrings descendant</td>
</tr>
<tr class="list2">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.VCLAppenders.TMemoLogAppender.html"><code>TMemoLogAppender</code></a></td>
<td class="itemdesc">Logs appending formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TMemo</td>
</tr>
</table>
<h2 class="authors">Author</h2>
<ul class="authors">
<li>Daniele Teti</li>
</ul>
Copyright 2016 Daniele Teti<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,86 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.VCLMemoAppender: Class TVCLMemoLogAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<a name="TVCLMemoLogAppender"></a><h1 class="cio">Class TVCLMemoLogAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Hierarchy">Hierarchy</a></td><td>Fields</td><td><a class="section" href="#PasDoc-Methods">Methods</a></td><td>Properties</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="unit">Unit</h2>
<p class="unitlink">
<a href="LoggerPro.VCLMemoAppender.html">LoggerPro.VCLMemoAppender</a></p>
<h2 class="declaration">Declaration</h2>
<p class="declaration">
<code>type TVCLMemoLogAppender = class(<a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a>)</code></p>
<h2 class="description">Description</h2>
<p>
Appends formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TMemo in a VCL application</p>
<a name="PasDoc-Hierarchy"></a><h2 class="hierarchy">Hierarchy</h2>
<ul class="hierarchy"><li class="ancestor">TInterfacedObject</li>
<li class="ancestor"><a class="normal" href="LoggerPro.TLoggerProAppenderBase.html">TLoggerProAppenderBase</a></li>
<li class="thisitem">TVCLMemoLogAppender</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Methods"></a><h3 class="summary">Methods</h3>
<table class="summary wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>constructor <b><a href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html#Create">Create</a></b>(aMemo: TMemo; aMaxLogLines: Word = 500); reintroduce;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html#Setup">Setup</a></b>; override;</code></td>
</tr>
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html#TearDown">TearDown</a></b>; override;</code></td>
</tr>
<tr class="list2">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><code>procedure <b><a href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html#WriteLog">WriteLog</a></b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); override;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Methods</h3>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Create"></a><code>constructor <b>Create</b>(aMemo: TMemo; aMaxLogLines: Word = 500); reintroduce;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="Setup"></a><code>procedure <b>Setup</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="TearDown"></a><code>procedure <b>TearDown</b>; override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="visibility"><a href="legend.html"><img src="public.gif" alt="Public" title="Public"></a></td>
<td class="itemcode"><a name="WriteLog"></a><code>procedure <b>WriteLog</b>(const aLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>); override;</code></td>
</tr>
<tr><td colspan="2">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,34 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro.VCLMemoAppender</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="unit">Unit LoggerPro.VCLMemoAppender</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td><a class="section" href="#PasDoc-Classes">Classes, Interfaces, Objects and Records</a></td><td>Functions and Procedures</td><td>Types</td><td>Constants</td><td>Variables</td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
&nbsp;<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li><a href="LoggerPro.html">LoggerPro</a></li><li>System.Classes</li><li>Vcl.StdCtrls</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Classes"></a><h3 class="cio">Classes, Interfaces, Objects and Records</h3>
<table class="classestable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.VCLMemoAppender.TVCLMemoLogAppender.html"><code>TVCLMemoLogAppender</code></a></td>
<td class="itemdesc">Appends formatted <a class="normal" href="LoggerPro.TLogItem.html">TLogItem</a> to a TMemo in a VCL application</td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,230 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: LoggerPro</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="unit">Unit LoggerPro</h1>
<table class="sections wide_list">
<tr>
<td><a class="section" href="#PasDoc-Description">Description</a></td><td><a class="section" href="#PasDoc-Uses">Uses</a></td><td><a class="section" href="#PasDoc-Classes">Classes, Interfaces, Objects and Records</a></td><td><a class="section" href="#PasDoc-FuncsProcs">Functions and Procedures</a></td><td><a class="section" href="#PasDoc-Types">Types</a></td><td>Constants</td><td><a class="section" href="#PasDoc-Variables">Variables</a></td></tr></table>
<a name="PasDoc-Description"></a><h2 class="description">Description</h2>
&nbsp;<a name="PasDoc-Uses"></a><h2 class="uses">Uses</h2>
<ul class="useslist"><li>System.Generics.Collections</li><li>System.SysUtils</li><li>System.Classes</li></ul><h2 class="overview">Overview</h2>
<a name="PasDoc-Classes"></a><h3 class="cio">Classes, Interfaces, Objects and Records</h3>
<table class="classestable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.TLogItem.html"><code>TLogItem</code></a></td>
<td class="itemdesc">Represent the single log item</td>
</tr>
<tr class="list2">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.TLoggerProEventsHandler.html"><code>TLoggerProEventsHandler</code></a></td>
<td class="itemdesc">&nbsp;</td>
</tr>
<tr class="list">
<td class="itemname">Interface&nbsp;<a class="bold" href="LoggerPro.ILogAppender.html"><code>ILogAppender</code></a></td>
<td class="itemdesc">Interface implemented by all the classes used as appenders</td>
</tr>
<tr class="list2">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.ELoggerPro.html"><code>ELoggerPro</code></a></td>
<td class="itemdesc">&nbsp;</td>
</tr>
<tr class="list">
<td class="itemname">Interface&nbsp;<a class="bold" href="LoggerPro.ILogWriter.html"><code>ILogWriter</code></a></td>
<td class="itemdesc">&nbsp;</td>
</tr>
<tr class="list2">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.TLoggerThread.html"><code>TLoggerThread</code></a></td>
<td class="itemdesc">&nbsp;</td>
</tr>
<tr class="list">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.TLogWriter.html"><code>TLogWriter</code></a></td>
<td class="itemdesc">&nbsp;</td>
</tr>
<tr class="list2">
<td class="itemname">Class&nbsp;<a class="bold" href="LoggerPro.TLoggerProAppenderBase.html"><code>TLoggerProAppenderBase</code></a></td>
<td class="itemdesc">&nbsp;</td>
</tr>
</table>
<a name="PasDoc-FuncsProcs"></a><h3 class="summary">Functions and Procedures</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code>function <b><a href="LoggerPro.html#BuildLogWriter">BuildLogWriter</a></b>(aAppenders: array of <a href="LoggerPro.ILogAppender.html">ILogAppender</a>; aEventsHandlers: <a href="LoggerPro.TLoggerProEventsHandler.html">TLoggerProEventsHandler</a> = nil; aLogLevel: <a href="LoggerPro.html#TLogType">TLogType</a> = TLogType.Debug): <a href="LoggerPro.ILogWriter.html">ILogWriter</a>;</code></td>
</tr>
</table>
<a name="PasDoc-Types"></a><h3 class="summary">Types</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a href="LoggerPro.html#TLogType">TLogType</a></b> = (...);</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a href="LoggerPro.html#TLogErrorReason">TLogErrorReason</a></b> = (...);</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code><b><a href="LoggerPro.html#TLogErrorAction">TLogErrorAction</a></b> = (...);</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a href="LoggerPro.html#TLoggerProAppenderErrorEvent">TLoggerProAppenderErrorEvent</a></b> = reference to procedure(const AppenderClassName
: string; const aFailedLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>; const Reason: <a href="LoggerPro.html#TLogErrorReason">TLogErrorReason</a>;
var Action: <a href="LoggerPro.html#TLogErrorAction">TLogErrorAction</a>);</code></td>
</tr>
<tr class="list">
<td class="itemcode"><code><b><a href="LoggerPro.html#TLogAppenderList">TLogAppenderList</a></b> = TList&lt;<a href="LoggerPro.ILogAppender.html">ILogAppender</a>&gt;;</code></td>
</tr>
</table>
<a name="PasDoc-Variables"></a><h3 class="summary">Variables</h3>
<table class="summary wide_list">
<tr class="list">
<td class="itemcode"><code><b><a href="LoggerPro.html#DefaultLoggerProMainQueueSize">DefaultLoggerProMainQueueSize</a></b>: Cardinal = 100000;</code></td>
</tr>
<tr class="list2">
<td class="itemcode"><code><b><a href="LoggerPro.html#DefaultLoggerProAppenderQueueSize">DefaultLoggerProAppenderQueueSize</a></b>: Cardinal = 10000;</code></td>
</tr>
</table>
<h2 class="description">Description</h2>
<h3 class="detail">Functions and Procedures</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="BuildLogWriter"></a><code>function <b>BuildLogWriter</b>(aAppenders: array of <a href="LoggerPro.ILogAppender.html">ILogAppender</a>; aEventsHandlers: <a href="LoggerPro.TLoggerProEventsHandler.html">TLoggerProEventsHandler</a> = nil; aLogLevel: <a href="LoggerPro.html#TLogType">TLogType</a> = TLogType.Debug): <a href="LoggerPro.ILogWriter.html">ILogWriter</a>;</code></td>
</tr>
<tr><td colspan="1">
<p>
Builds a new ILogWriter instance. Call this global function to start logging like a pro.</p>
<p>
Here's a sample unit that you can use in your code </p>
<pre class="longcode">
<span class="pascal_keyword">unit</span> LoggerProConfig;
<span class="pascal_keyword">interface</span>
<span class="pascal_keyword">uses</span>
LoggerPro;
<span class="pascal_keyword">function</span> Log: ILogWriter;
<span class="pascal_keyword">implementation</span>
<span class="pascal_keyword">uses</span>
LoggerPro.FileAppender;
<span class="pascal_keyword">var</span>
_Log: ILogWriter;
<span class="pascal_keyword">function</span> Log: ILogWriter;
<span class="pascal_keyword">begin</span>
Result := _Log;
<span class="pascal_keyword">end</span>;
<span class="pascal_keyword">initialization</span>
<span class="pascal_comment">//If you need other appenders, feel free to add them here in the array</span>
_Log := BuildLogWriter([TLoggerProFileAppender.Create(<span class="pascal_numeric">10</span>, <span class="pascal_numeric">5</span>)]);
<span class="pascal_keyword">end</span>.
</pre>
<p>
<p>Add this unit to your project, then when you need to use the logger, include the unit and call one of the followings: </p>
<ul class="paragraph_spacing">
<li><p>Log.Debug('This is a debug message', 'tag1')</p></li>
<li><p>Log.Info('This is an information message', 'tag1')</p></li>
<li><p>Log.Warn('This is a warning message', 'tag1')</p></li>
<li><p>Log.Error('This is an error message', 'tag1')</p></li>
</ul>
<p></p>
</td></tr>
</table>
<h3 class="detail">Types</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TLogType"></a><code><b>TLogType</b> = (...);</code></td>
</tr>
<tr><td colspan="1">
&nbsp;<h6 class="description_section">Values</h6>
<ul>
<li>
Debug = 0: &nbsp;</li>
<li>
Info: &nbsp;</li>
<li>
Warning: &nbsp;</li>
<li>
Error: &nbsp;</li>
</ul>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TLogErrorReason"></a><code><b>TLogErrorReason</b> = (...);</code></td>
</tr>
<tr><td colspan="1">
&nbsp;<h6 class="description_section">Values</h6>
<ul>
<li>
QueueFull: &nbsp;</li>
</ul>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TLogErrorAction"></a><code><b>TLogErrorAction</b> = (...);</code></td>
</tr>
<tr><td colspan="1">
&nbsp;<h6 class="description_section">Values</h6>
<ul>
<li>
Skip: &nbsp;</li>
<li>
DisableAppender: &nbsp;</li>
</ul>
</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TLoggerProAppenderErrorEvent"></a><code><b>TLoggerProAppenderErrorEvent</b> = reference to procedure(const AppenderClassName
: string; const aFailedLogItem: <a href="LoggerPro.TLogItem.html">TLogItem</a>; const Reason: <a href="LoggerPro.html#TLogErrorReason">TLogErrorReason</a>;
var Action: <a href="LoggerPro.html#TLogErrorAction">TLogErrorAction</a>);</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="TLogAppenderList"></a><code><b>TLogAppenderList</b> = TList&lt;<a href="LoggerPro.ILogAppender.html">ILogAppender</a>&gt;;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<h3 class="detail">Variables</h3>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="DefaultLoggerProMainQueueSize"></a><code><b>DefaultLoggerProMainQueueSize</b>: Cardinal = 100000;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
<table class="detail wide_list">
<tr class="list">
<td class="itemcode"><a name="DefaultLoggerProAppenderQueueSize"></a><code><b>DefaultLoggerProAppenderQueueSize</b>: Cardinal = 10000;</code></td>
</tr>
<tr><td colspan="1">
&nbsp;</td></tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

View File

@ -1,47 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: All Units</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="allitems">All Units</h1>
<table class="unitstable wide_list">
<tr class="listheader">
<th class="itemname">Name</th>
<th class="itemdesc">Description</th>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.html">LoggerPro</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.ConsoleAppender.html">LoggerPro.ConsoleAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.FileAppender.html">LoggerPro.FileAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.GlobalLogger.html">LoggerPro.GlobalLogger</a></td>
<td class="itemdesc"><p>Contains the global logger as a thread safe singleton</p></td>
</tr>
<tr class="list">
<td class="itemname"><a class="bold" href="LoggerPro.OutputDebugStringAppender.html">LoggerPro.OutputDebugStringAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
<tr class="list2">
<td class="itemname"><a class="bold" href="LoggerPro.VCLMemoAppender.html">LoggerPro.VCLMemoAppender</a></td>
<td class="itemdesc"><p>&nbsp;</p></td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,55 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>LoggerPro: Legend</title>
<meta name="generator" content="PasDoc 0.14.0">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="StyleSheet" type="text/css" href="pasdoc.css">
</head>
<body>
<table class="container"><tr><td class="navigation">
<h2>LoggerPro</h2><p><a href="AllUnits.html" class="navigation">Units</a></p><p><a href="ClassHierarchy.html" class="navigation">Class Hierarchy</a></p><p><a href="AllClasses.html" class="navigation">Classes, Interfaces, Objects and Records</a></p><p><a href="AllTypes.html" class="navigation">Types</a></p><p><a href="AllVariables.html" class="navigation">Variables</a></p><p><a href="AllConstants.html" class="navigation">Constants</a></p><p><a href="AllFunctions.html" class="navigation">Functions and Procedures</a></p><p><a href="AllIdentifiers.html" class="navigation">Identifiers</a></p></td><td class="content">
<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
<h1 class="markerlegend">Legend</h1>
<table class="markerlegend wide_list">
<tr class="listheader">
<th class="itemname">Marker</th>
<th class="itemdesc">Visibility</th>
</tr>
<tr class="list">
<td class="legendmarker"><img src="private.gif" alt="Strict Private" title="Strict Private"></td>
<td class="legenddesc">Strict Private</td>
</tr>
<tr class="list2">
<td class="legendmarker"><img src="private.gif" alt="Private" title="Private"></td>
<td class="legenddesc">Private</td>
</tr>
<tr class="list">
<td class="legendmarker"><img src="protected.gif" alt="Strict Protected" title="Strict Protected"></td>
<td class="legenddesc">Strict Protected</td>
</tr>
<tr class="list2">
<td class="legendmarker"><img src="protected.gif" alt="Protected" title="Protected"></td>
<td class="legenddesc">Protected</td>
</tr>
<tr class="list">
<td class="legendmarker"><img src="public.gif" alt="Public" title="Public"></td>
<td class="legenddesc">Public</td>
</tr>
<tr class="list2">
<td class="legendmarker"><img src="published.gif" alt="Published" title="Published"></td>
<td class="legenddesc">Published</td>
</tr>
<tr class="list">
<td class="legendmarker"><img src="automated.gif" alt="Automated" title="Automated"></td>
<td class="legenddesc">Automated</td>
</tr>
<tr class="list2">
<td class="legendmarker"><img src="published.gif" alt="Implicit" title="Implicit"></td>
<td class="legenddesc">Implicit</td>
</tr>
</table>
Copyright 2016 Daniele Teti
<hr noshade size="1"><span class="appinfo"><em>Generated by <a href="http://pasdoc.sourceforge.net/">PasDoc 0.14.0</a>. </em>
</span>
</td></tr></table></body></html>

View File

@ -1,193 +0,0 @@
/*
Copyright 1998-2014 PasDoc developers.
This file is part of "PasDoc".
"PasDoc" is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
"PasDoc" 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. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with "PasDoc"; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
----------------------------------------------------------------------------
*/
body, html, table.container {
margin: 0;
padding: 0;
}
body {
font-family: Verdana,Arial;
color: black;
background-color: white;
font-size: 12px;
}
table.container {
width: 100%;
border-spacing: 0;
}
table.container td {
vertical-align: top;
}
td.navigation {
width: 200px;
color: white;
background-color: #787878;
margin: 0;
/* padding-bottom is a little larger, to make navigation column have some
nice height even when td.content column is very small. */
padding: 1em 1em 100px 1em;
}
td.navigation p { padding: 0; }
td.navigation h2 { margin-top: 0; }
td.content { padding: 1em; }
td.content h1 { margin-top: 0; }
img { border:0px; }
a:link {color:#C91E0C; text-decoration: none; }
a:visited {color:#7E5C31; text-decoration: none; }
a:hover {text-decoration: underline; }
a:active {text-decoration: underline; }
a.navigation:link { color: white; text-decoration: none; }
a.navigation:visited { color: white; text-decoration: none; }
a.navigation:hover { color: white; font-weight: bold; text-decoration: none; }
a.navigation:active { color: white; text-decoration: none; }
a.bold:link {color:#C91E0C; text-decoration: none; font-weight:bold; }
a.bold:visited {color:#7E5C31; text-decoration: none; font-weight:bold; }
a.bold:hover {text-decoration: underline; font-weight:bold; }
a.bold:active {text-decoration: underline; font-weight:bold; }
a.section {color: green; text-decoration: none; font-weight: bold; }
a.section:hover {color: green; text-decoration: underline; font-weight: bold; }
ul.useslist a:link {color:#C91E0C; text-decoration: none; font-weight:bold; }
ul.useslist a:visited {color:#7E5C31; text-decoration: none; font-weight:bold; }
ul.useslist a:hover {text-decoration: underline; font-weight:bold; }
ul.useslist a:active {text-decoration: underline; font-weight:bold; }
ul.hierarchy { list-style-type:none; }
ul.hierarchylevel { list-style-type:none; }
p.unitlink a:link {color:#C91E0C; text-decoration: none; font-weight:bold; }
p.unitlink a:visited {color:#7E5C31; text-decoration: none; font-weight:bold; }
p.unitlink a:hover {text-decoration: underline; font-weight:bold; }
p.unitlink a:active {text-decoration: underline; font-weight:bold; }
tr.list { background: #FFBF44; }
tr.list2 { background: #FFC982; }
tr.listheader { background: #C91E0C; color: white; }
table.wide_list { border-spacing:2px; width:100%; }
table.wide_list td { vertical-align:top; padding:4px; }
table.markerlegend { width:auto; }
table.markerlegend td.legendmarker { text-align:center; }
table.sections { background:white; }
table.sections td {background:lightgray; }
table.summary td.itemcode { width:100%; }
table.detail td.itemcode { width:100%; }
td.itemname {white-space:nowrap; }
td.itemunit {white-space:nowrap; }
td.itemdesc { width:100%; }
div.nodescription { color:red; }
dl.parameters dt { color:blue; }
/* Various browsers have various default styles for <h6>,
sometimes ugly for our purposes, so it's best to set things
like font-size and font-weight in out pasdoc.css explicitly. */
h6.description_section {
/* font-size 100% means that it has the same font size as the
parent element, i.e. normal description text */
font-size: 100%;
font-weight: bold;
/* By default browsers usually have some large margin-bottom and
margin-top for <h1-6> tags. In our case, margin-bottom is
unnecessary, we want to visually show that description_section
is closely related to content below. In this situation
(where the font size is just as a normal text), smaller bottom
margin seems to look good. */
margin-bottom: 0em;
}
/* Style applied to Pascal code in documentation
(e.g. produced by @longcode tag) } */
span.pascal_string { color: #000080; }
span.pascal_keyword { font-weight: bolder; }
span.pascal_comment { color: #000080; font-style: italic; }
span.pascal_compiler_comment { color: #008000; }
span.pascal_numeric { }
span.pascal_hex { }
p.hint_directive { color: red; }
input#search_text { }
input#search_submit_button { }
acronym.mispelling { background-color: #ffa; }
/* Actually this reduces vertical space between *every* paragraph
inside list with @itemSpacing(compact).
While we would like to reduce this space only for the
top of 1st and bottom of last paragraph within each list item.
But, well, user probably will not do any paragraph breaks
within a list with @itemSpacing(compact) anyway, so it's
acceptable solution. */
ul.compact_spacing p { margin-top: 0em; margin-bottom: 0em; }
ol.compact_spacing p { margin-top: 0em; margin-bottom: 0em; }
dl.compact_spacing p { margin-top: 0em; margin-bottom: 0em; }
/* Style for table created by @table tags:
just some thin border.
This way we have some borders around the cells
(so cells are visibly separated), but the border
"blends with the background" so it doesn't look too ugly.
Hopefully it looks satisfactory in most cases and for most
people.
We add padding for cells, otherwise they look too close.
This is normal thing to do when border-collapse is set to
collapse (because this eliminates spacing between cells).
*/
table.table_tag { border-collapse: collapse; }
table.table_tag td { border: 1pt solid gray; padding: 0.3em; }
table.table_tag th { border: 1pt solid gray; padding: 0.3em; }
table.detail {
border: 1pt solid gray;
margin-top: 0.3em;
margin-bottom: 0.3em;
}
.search-form { white-space: nowrap; }
.search-input, .search-button { display: inline-block; vertical-align: middle; }
/* Do not make extra vertical space at the beginning/end of table cells.
We need ">" selector, to not change paragraphs inside lists inside
table cells. */
table.table_tag td > p:first-child,
table.table_tag th > p:first-child,
td.itemdesc > p:first-child { margin-top: 0em; }
table.table_tag td > p:last-child,
table.table_tag th > p:last-child,
td.itemdesc > p:last-child { margin-bottom: 0em; }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

View File

@ -1,125 +0,0 @@
import subprocess
import os
from datetime import datetime
from colorama import *
init() #colorama initialization
### task setup env
DOIT_CONFIG = {'verbosity': 2, 'default_tasks': ['build']}
###############################################################################################
############## CONFIGURATION ##################################################################
###############################################################################################
projects = [
('samples\\01_global_logger\\global_logger.dproj','Win32'),
('samples\\02_file_appender\\file_appender.dproj','Win32'),
('samples\\03_console_appender\\console_appender.dproj','Win32'),
('samples\\04_outputdebugstring_appender\\outputdebugstring_appender.dproj','Win32'),
('samples\\05_vcl_appenders\\vcl_appenders.dproj','Win32'),
('samples\\08_email_appender\\email_appender.dproj','Win32'),
('samples\\10_multiple_appenders\\multiple_appenders.dproj','Win32'),
('samples\\15_appenders_with_different_log_levels\\multi_appenders_different_loglevels.dproj','Win32'),
('samples\\20_multiple_loggers\\multiple_loggers.dproj','Win32'),
('samples\\50_custom_appender\\custom_appender.dproj','Win32'),
('samples\\60_logging_inside_dll\\MainProgram.dproj','Win32'),
('samples\\60_logging_inside_dll\\mydll.dproj','Win32'),
('samples\\70_isapi_sample\\loggerproisapisample.dproj','Win32'),
('samples\\90_remote_logging_with_redis\\REDISAppenderSample.dproj','Win32'),
('samples\\90_remote_logging_with_redis\\redis_logs_viewer\\REDISLogsViewer.dproj','Win32'),
('samples\\100_udp_syslog\\udp_syslog.dproj','Win32'),
('samples\\110_rest_appender\RESTAppenderSample.dproj','Win32'),
('samples\\110_rest_appender_mobile\RESTAppenderMobileSample.dproj','Android'),
('samples\\120_elastic_search_appender\\ElasticSearchAppenderSample.dproj','Win32'),
('samples\\rest_logs_collector\RESTLogsCollector.dproj','Win32')
]
release_path = "BUILD"
###############################################################################################
############## END CONFIGURATION ##############################################################
###############################################################################################
GlobalBuildVersion = 'DEV' #if we are building an actual release, this will be replaced
def header(headers):
elements = None
if type(headers).__name__ == 'str':
elements = [headers]
else:
elements = headers
print(Style.BRIGHT + Back.WHITE + Fore.RED + "*" * 80 + Style.RESET_ALL)
for txt in elements:
s = '{:^80}'.format(txt)
print(Style.BRIGHT + Back.WHITE + Fore.RED + s + Style.RESET_ALL)
print(Style.BRIGHT + Back.WHITE + Fore.RED + "*" * 80 + Style.RESET_ALL)
def buildProject(project, config = 'DEBUG'):
project_file, platform = project
header(["Building", project_file,"(config " + config + ")"])
p = project_file.replace('.dproj', '.cfg')
if os.path.isfile(p):
if os.path.isfile(p + '.unused'):
os.remove(p + '.unused')
os.rename(p, p + '.unused')
return subprocess.call(f"rsvars.bat & msbuild /t:Build /p:Config={config} /p:Platform={platform} \"{project_file}\"", shell=True) == 0
def buildProjects():
res = True
for project in projects:
res &= buildProject(project)
if not res:
print("Failed " + project[0])
return res
def build_unit_tests():
res = buildProject(('unittests\\UnitTests.dproj','Win32'), 'PLAINDUNITX')
return res
def create_build_tag(version):
global GlobalBuildVersion
GlobalBuildVersion = version
header("BUILD VERSION: " + GlobalBuildVersion)
f = open("VERSION.TXT","w")
f.write("VERSION " + GlobalBuildVersion + "\n")
f.write("BUILD DATETIME " + datetime.now().isoformat() + "\n")
f.close()
#############################################################################################################################
def task_build():
'''Use: doit build -v <VERSION> -> Builds all the projects. Then creates SFX archive.'''
return {
'actions': [
create_build_tag,
"echo %%date%% %%time:~0,8%% > LOGGERPRO-BUILD-TIMESTAMP.TXT",
buildProjects,
build_unit_tests,
"unittests\\Win32\\PLAINDUNITX\\UnitTests.exe -exit:Continue"],
'params':[{'name':'version',
'short':'v',
'long':'version',
'type':str,
'default':'DEVELOPMENT'}
],
'verbosity': 2
}
def task_unittests():
'''Use: doit unittests. Builds unittests project and run it.'''
return {
'actions': [
build_unit_tests,
"unittests\\Win32\\PLAINDUNITX\\UnitTests.exe -exit:Continue"
],
'params':[{'name':'version',
'short':'v',
'long':'version',
'type':str,
'default':'DEVELOPMENT'}
],
'verbosity': 2
}

View File

@ -1,78 +0,0 @@
[Main]
StoreRelativePaths=1
Language=en
OutputDir=docs\
GenerateFormat=0
ProjectName=
Verbosity=2
ClassMembers_0=1
ClassMembers_1=1
ClassMembers_2=0
ClassMembers_3=0
ClassMembers_4=0
ClassMembers_5=0
ClassMembers_6=1
ClassMembers_7=0
ImplicitVisibility=0
Sorting_0=0
Sorting_1=0
Sorting_2=0
Sorting_3=0
Sorting_4=0
Sorting_5=0
Sorting_6=0
Sorting_7=0
Sorting_8=0
Sorting_9=0
CssFileName=
IntroductionFileName=
ConclusionFileName=
WriteUsesList=1
AutoAbstract=0
AutoLink=0
HandleMacros=1
UseTipueSearch=0
LineBreakQuality=0
SpecialMarkerTreatment=1
Title=LoggerPro
VizGraphClasses=0
VizGraphUses=0
CheckSpelling=0
LatexGraphicsPackage=0
[Defines]
Count=4
Item_0=FPC
Item_1=MSWINDOWS
Item_2=WIN32
Item_3=CPU386
[Header]
Count=1
Item_0=<h2>LoggerPro (1.0)</h2><p>A simple, pluggable and modern logging framework for Delphi</p>
[Footer]
Count=1
Item_0=Copyright 2016 Daniele Teti
[IncludeDirectories]
Count=1
Item_0=..\LoggerPro
[Files]
Count=6
Item_0=LoggerPro.ConsoleAppender.pas
Item_1=LoggerPro.FileAppender.pas
Item_2=LoggerPro.OutputDebugStringAppender.pas
Item_3=LoggerPro.pas
Item_4=LoggerPro.VCLMemoAppender.pas
Item_5=LoggerPro.GlobalLogger.pas
[HyphenatedWords]
Count=0
[SpecialMarkers]
Count=0
[IgnoreWords]
Count=0

View File

@ -1,61 +0,0 @@
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'LoggerPro SAMPLE'
ClientHeight = 132
ClientWidth = 584
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 8
Top = 8
Width = 137
Height = 57
Caption = 'DEBUG'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 151
Top = 8
Width = 137
Height = 57
Caption = 'INFO'
TabOrder = 1
OnClick = Button2Click
end
object Button3: TButton
Left = 294
Top = 8
Width = 137
Height = 57
Caption = 'WARNING'
TabOrder = 2
OnClick = Button3Click
end
object Button4: TButton
Left = 437
Top = 8
Width = 137
Height = 57
Caption = 'ERROR'
TabOrder = 3
OnClick = Button4Click
end
object Button5: TButton
Left = 8
Top = 71
Width = 280
Height = 57
Caption = 'Multithread logging'
TabOrder = 4
OnClick = Button5Click
end
end

View File

@ -1,93 +0,0 @@
unit MainFormU;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TMainForm = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses
// for fast&dirty logging, you can just include
// the unit LoggerPro.GlobalLogger and start to log!
LoggerPro.GlobalLogger;
{$R *.dfm}
procedure TMainForm.Button1Click(Sender: TObject);
begin
Log.Debug('This is a debug message with TAG1', 'TAG1');
Log.Debug('This is a debug message with TAG2', 'TAG2');
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
Log.Info('This is a info message with TAG1', 'TAG1');
Log.Info('This is a info message with TAG2', 'TAG2');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
Log.Warn('This is a warning message with TAG1', 'TAG1');
Log.Warn('This is a warning message with TAG2', 'TAG2');
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin
Log.Error('This is an error message with TAG1', 'TAG1');
Log.Error('This is an error message with TAG2', 'TAG2');
end;
procedure TMainForm.Button5Click(Sender: TObject);
var
lThreadProc: TProc;
begin
lThreadProc := procedure
var
I: Integer;
lThreadID: String;
begin
lThreadID := IntToStr(TThread.CurrentThread.ThreadID);
for I := 1 to 200 do
begin
Log.Debug('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
Log.Info('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
Log.Warn('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
Log.Error('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
end;
end;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
end;
end.

View File

@ -1,14 +0,0 @@
program global_logger;
uses
Vcl.Forms,
MainFormU in 'MainFormU.pas' {MainForm};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

File diff suppressed because it is too large Load Diff

View File

@ -1,60 +0,0 @@
unit LoggerProConfig;
interface
uses
LoggerPro;
function Log: ILogWriter;
implementation
uses
LoggerPro.FileAppender;
var
_Log: ILogWriter;
function Log: ILogWriter;
begin
Result := _Log;
end;
initialization
{ The TLoggerProFileAppender has its defaults defined as follows:
DEFAULT_LOG_FORMAT = '%0:s [TID %1:-8d][%2:-10s] %3:s [%4:s]';
DEFAULT_MAX_BACKUP_FILE_COUNT = 5;
DEFAULT_MAX_FILE_SIZE_KB = 1000;
You can override these dafaults passing parameters to the constructor.
Here's some configuration examples:
@longcode(#
// Creates log in the same exe folder without PID in the filename
_Log := BuildLogWriter([TLoggerProFileAppender.Create(10, 5,
[TFileAppenderOption.LogsInTheSameFolder])]);
// Creates log in the AppData/Roaming with PID in the filename
_Log := BuildLogWriter([TLoggerProFileAppender.Create(10, 5,
[TFileAppenderOption.IncludePID])]);
// Creates log in the same folder with PID in the filename
_Log := BuildLogWriter([TLoggerProFileAppender.Create(10, 5,
[TFileAppenderOption.IncludePID])]);
#)
}
// Creates log in the ..\..\ folder without PID in the filename
_Log := BuildLogWriter([TLoggerProFileAppender.Create(10, 5, '..\..', [])]);
// Create logs in the exe' same folder
// _Log := BuildLogWriter([TLoggerProFileAppender.Create(10, 5)]);
// Creates log in the AppData/Roaming with PID in the filename
// _Log := BuildLogWriter([TLoggerProFileAppender.Create(10, 5,
// [TFileAppenderOption.IncludePID])]);
// Creates log in the same folder with PID in the filename
// _Log := BuildLogWriter([TLoggerProFileAppender.Create(10, 5,
// [TFileAppenderOption.IncludePID])]);
end.

View File

@ -1,15 +0,0 @@
program file_appender;
uses
Vcl.Forms,
LoggerProConfig in 'LoggerProConfig.pas',
MainFormU in '..\common\MainFormU.pas' {MainForm};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
unit LoggerProConfig;
interface
uses
LoggerPro;
function Log: ILogWriter;
implementation
uses
LoggerPro.ConsoleAppender, Winapi.Windows;
var
_Log: ILogWriter;
function Log: ILogWriter;
begin
Result := _Log;
end;
initialization
_Log := BuildLogWriter([TLoggerProConsoleAppender.Create]);
if not IsConsole then
AllocConsole;
end.

View File

@ -1,16 +0,0 @@
program console_appender;
uses
Vcl.Forms,
LoggerProConfig in 'LoggerProConfig.pas',
MainFormU in '..\common\MainFormU.pas' {MainForm};
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -1,27 +0,0 @@
unit LoggerProConfig;
interface
uses
LoggerPro;
function Log: ILogWriter;
implementation
uses
LoggerPro.OutputDebugStringAppender;
var
_Log: ILogWriter;
function Log: ILogWriter;
begin
Result := _Log;
end;
initialization
_Log := BuildLogWriter([TLoggerProOutputDebugStringAppender.Create])
end.

View File

@ -1,15 +0,0 @@
program outputdebugstring_appender;
uses
Vcl.Forms,
LoggerProConfig in 'LoggerProConfig.pas',
MainFormU in '..\common\MainFormU.pas' {MainForm};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -1,133 +0,0 @@
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'LoggerPro SAMPLE'
ClientHeight = 535
ClientWidth = 834
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Visible = True
OnCreate = FormCreate
DesignSize = (
834
535)
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 8
Top = 8
Width = 137
Height = 57
Caption = 'DEBUG'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 151
Top = 8
Width = 137
Height = 57
Caption = 'INFO'
TabOrder = 1
OnClick = Button2Click
end
object Button3: TButton
Left = 294
Top = 8
Width = 137
Height = 57
Caption = 'WARNING'
TabOrder = 2
OnClick = Button3Click
end
object Button4: TButton
Left = 437
Top = 8
Width = 137
Height = 57
Caption = 'ERROR'
TabOrder = 3
OnClick = Button4Click
end
object Button5: TButton
Left = 8
Top = 71
Width = 280
Height = 57
Caption = 'Multithread logging'
TabOrder = 4
OnClick = Button5Click
end
object PageControl1: TPageControl
Left = 8
Top = 134
Width = 818
Height = 393
ActivePage = tsListViewAppender
Anchors = [akLeft, akTop, akRight, akBottom]
TabOrder = 5
object tsListViewAppender: TTabSheet
Caption = 'ListView Appender DEMO'
object ListView1: TListView
Left = 0
Top = 0
Width = 810
Height = 365
Align = alClient
Columns = <
item
AutoSize = True
Caption = 'Application Logs'
end>
ColumnClick = False
Ctl3D = False
DoubleBuffered = True
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Consolas'
Font.Style = []
OwnerDraw = True
RowSelect = True
ParentDoubleBuffered = False
ParentFont = False
TabOrder = 0
ViewStyle = vsReport
end
end
object tsMemoAppender: TTabSheet
Caption = 'Memo Appender DEMO'
ImageIndex = 1
ExplicitLeft = 0
ExplicitTop = 0
ExplicitWidth = 281
ExplicitHeight = 165
object Memo1: TMemo
Left = 0
Top = 0
Width = 810
Height = 365
Align = alClient
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Courier New'
Font.Style = []
ParentFont = False
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 0
WordWrap = False
ExplicitLeft = -535
ExplicitTop = -228
ExplicitWidth = 816
ExplicitHeight = 393
end
end
end
end

View File

@ -1,117 +0,0 @@
unit VCLAppendersFormU;
interface
uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
LoggerPro,
Vcl.ComCtrls,
System.ImageList,
Vcl.ImgList;
type
TMainForm = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
PageControl1: TPageControl;
tsListViewAppender: TTabSheet;
tsMemoAppender: TTabSheet;
Memo1: TMemo;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FLog: ILogWriter;
{ Private declarations }
public
function Log: ILogWriter;
end;
var
MainForm: TMainForm;
implementation
uses
LoggerPro.VCLMemoAppender,
LoggerPro.VCLListViewAppender;
{$R *.dfm}
procedure TMainForm.Button1Click(Sender: TObject);
begin
Log.Debug('This is a debug message with TAG1', 'TAG1');
Log.Debug('This is a debug message with TAG2', 'TAG2');
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
Log.Info('This is a info message with TAG1', 'TAG1');
Log.Info('This is a info message with TAG2', 'TAG2');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
Log.Warn('This is a warning message with TAG1', 'TAG1');
Log.Warn('This is a warning message with TAG2', 'TAG2');
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin
Log.Error('This is an error message with TAG1', 'TAG1');
Log.Error('This is an error message with TAG2', 'TAG2');
end;
procedure TMainForm.Button5Click(Sender: TObject);
var
lThreadProc: TProc;
begin
lThreadProc := procedure
var
I: Integer;
lThreadID: String;
begin
lThreadID := IntToStr(TThread.CurrentThread.ThreadID);
for I := 1 to 50 do
begin
Log.Debug('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID, 'MULTITHREADING');
Log.Info('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID, 'MULTITHREADING');
Log.Warn('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID, 'MULTITHREADING');
Log.Error('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID, 'MULTITHREADING');
end;
end;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
// Let's create the local loggers for this form
FLog := BuildLogWriter([TVCLListViewAppender.Create(ListView1), TVCLMemoLogAppender.Create(Memo1)])
end;
function TMainForm.Log: ILogWriter;
begin
Result := FLog;
end;
end.

View File

@ -1,14 +0,0 @@
program vcl_appenders;
uses
Vcl.Forms,
VCLAppendersFormU in 'VCLAppendersFormU.pas' {MainForm};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

File diff suppressed because it is too large Load Diff

View File

@ -1,81 +0,0 @@
unit LoggerProConfig;
interface
uses
LoggerPro;
function Log: ILogWriter;
implementation
uses
LoggerPro.FileAppender,
LoggerPro.EMailAppender,
LoggerPro.OutputDebugStringAppender,
System.SysUtils,
idSMTP, System.IOUtils,
IdIOHandlerStack, IdSSL,
IdSSLOpenSSL, IdExplicitTLSClientServerBase;
var
_Log: ILogWriter;
const
USE_SSL = true;
function Log: ILogWriter;
begin
Result := _Log;
end;
function GetSMTP: TidSMTP;
begin
Result := TidSMTP.Create(nil);
try
if USE_SSL then
begin
Result.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Result);
end;
Result.Host := 'smtp.gmail.com';
Result.Port := 25;
Result.UseTLS := TIdUseTLS.utUseImplicitTLS;
Result.AuthType := satDefault;
Result.Username := 'daniele.teti@gmail.com';
if not TFile.Exists('config.txt') then
raise Exception.Create('Create a "config.txt" file containing the password');
Result.Password := TFile.ReadAllText('config.txt'); // '<yourpassword>';
except
Result.Free;
raise;
end;
end;
procedure SetupLogger;
const
{$IFDEF DEBUG}
LOG_LEVEL = TLogType.Debug;
{$ELSE}
LOG_LEVEL = TLogType.Warning;
{$ENDIF}
var
lEmailAppender: ILogAppender;
begin
lEmailAppender := TLoggerProEMailAppender.Create(GetSMTP, 'LoggerPro<daniele.teti@gmail.com>', 'd.teti@bittime.it');
lEmailAppender.SetLogLevel(TLogType.Error);
_Log := BuildLogWriter([TLoggerProFileAppender.Create,
lEmailAppender,
TLoggerProOutputDebugStringAppender.Create], nil, LOG_LEVEL);
end;
initialization
SetupLogger;
end.

View File

@ -1,62 +0,0 @@
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'LoggerPro SAMPLE'
ClientHeight = 140
ClientWidth = 584
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Visible = True
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 8
Top = 8
Width = 137
Height = 57
Caption = 'DEBUG'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 151
Top = 8
Width = 137
Height = 57
Caption = 'INFO'
TabOrder = 1
OnClick = Button2Click
end
object Button3: TButton
Left = 294
Top = 8
Width = 137
Height = 57
Caption = 'WARNING'
TabOrder = 2
OnClick = Button3Click
end
object Button4: TButton
Left = 437
Top = 8
Width = 137
Height = 57
Caption = 'ERROR'
TabOrder = 3
OnClick = Button4Click
end
object Button5: TButton
Left = 8
Top = 71
Width = 280
Height = 57
Caption = 'Multithread logging'
TabOrder = 4
OnClick = Button5Click
end
end

View File

@ -1,88 +0,0 @@
unit MainFormU;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, LoggerPro;
type
TMainForm = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
end;
var
MainForm: TMainForm;
implementation
uses
LoggerPro.VCLMemoAppender, LoggerProConfig;
{$R *.dfm}
procedure TMainForm.Button1Click(Sender: TObject);
begin
Log.Debug('This is a debug message with TAG1', 'TAG1');
Log.Debug('This is a debug message with TAG2', 'TAG2');
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
Log.Info('This is a info message with TAG1', 'TAG1');
Log.Info('This is a info message with TAG2', 'TAG2');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
Log.Warn('This is a warning message with TAG1', 'TAG1');
Log.Warn('This is a warning message with TAG2', 'TAG2');
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin
Log.Error('This is an error message with TAG1', 'TAG1');
Log.Error('This is an error message with TAG2', 'TAG2');
end;
procedure TMainForm.Button5Click(Sender: TObject);
var
lThreadProc: TProc;
begin
lThreadProc := procedure
var
I: Integer;
lThreadID: String;
begin
lThreadID := IntToStr(TThread.Current.ThreadID);
for I := 1 to 200 do
begin
Log.Debug('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
Log.Info('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
Log.Warn('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
Log.Error('log message ' + TimeToStr(now) + ' ThreadID: ' + lThreadID,
'MULTITHREADING');
end;
end;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
end;
end.

View File

@ -1,15 +0,0 @@
program email_appender;
uses
Vcl.Forms,
MainFormU in 'MainFormU.pas' {MainForm},
LoggerProConfig in 'LoggerProConfig.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -1,574 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{3EC88B82-7B27-4D69-8E7E-632D33F11C42}</ProjectGuid>
<ProjectVersion>18.2</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>email_appender.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Application</AppType>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
<SanitizedProjectName>email_appender</SanitizedProjectName>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
<DCC_E>false</DCC_E>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
<VerInfo_Keys>CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys>
<DCC_UnitSearchPath>..\..\;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UsePackage>DBXSqliteDriver;DBXDb2Driver;dxCoreRS23;vclactnband;frxe23;vclFireDAC;dxPSLnksRS23;dxPSdxLCLnkRS23;tethering;cxDataRS23;dxPSdxOCLnkRS23;dxTabbedMDIRS23;FireDACADSDriver;dxSkinBlackRS23;dxSkinLondonLiquidSkyRS23;JvPluginSystem;dxDBXServerModeRS23;dxHttpIndyRequestRS23;dxPScxGridLnkRS23;cxSchedulerRS23;FireDACMSSQLDriver;dclRBDBE1723;vcltouch;JvBands;vcldb;rbDB1723;svn;dxWizardControlRS23;dxSkinMcSkinRS23;dxPScxCommonRS23;JvJans;Intraweb;dxSkinOffice2007BlueRS23;rbIBE1723;dxBarRS23;cxSchedulerRibbonStyleEventEditorRS23;dxSkinOffice2013WhiteRS23;JvDotNetCtrls;dxPSTeeChartRS23;cxLibraryRS23;dxSkinVisualStudio2013LightRS23;vclib;cxPivotGridChartRS23;rbDBE1723;dxSkinSummer2008RS23;dxPSdxDBOCLnkRS23;dxGDIPlusRS23;dxSkinDarkSideRS23;FireDACDBXDriver;dxSkinFoggyRS23;dxSkinSevenRS23;vclx;rbCIDE1723;dxSkinOffice2010SilverRS23;dxdborRS23;RESTBackendComponents;dxLayoutControlRS23;dxPSPrVwRibbonRS23;VCLRESTComponents;dxSkinDevExpressStyleRS23;dxSkinWhiteprintRS23;vclie;bindengine;CloudService;rbRAP1723;JvHMI;FireDACMySQLDriver;dxSkinOffice2013DarkGrayRS23;DataSnapClient;dxPScxPCProdRS23;bindcompdbx;DBXSybaseASEDriver;IndyIPServer;dxSkinPumpkinRS23;IndySystem;dsnapcon;cxTreeListdxBarPopupMenuRS23;dclRBIBE1723;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSkinLilianRS23;Jcl;rbADO1723;dxBarDBNavRS23;dxFlowChartRS23;dxSkinOffice2016ColorfulRS23;rbUSER1723;DBXOdbcDriver;FireDACTDataDriver;FMXTee;ipstudiowinclient;soaprtl;DbxCommonDriver;dxSpreadSheetRS23;AsyncProDR;JvManagedThreads;dxSkinOffice2007PinkRS23;dxPSdxSpreadSheetLnkRS23;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;DTKANPRPackage;dxSkinHighContrastRS23;rtl;dxSkinSevenClassicRS23;DbxClientDriver;dxSkinDevExpressDarkStyleRS23;DBXSybaseASADriver;dxNavBarRS23;dxSkinMetropolisDarkRS23;CodeSiteExpressPkg;dxSkinTheAsphaltWorldRS23;JvSystem;SampleListViewMultiDetailAppearancePackage;dxRichEditControlRS23;JvStdCtrls;JvTimeFramework;ipstudiowin;appanalytics;cxPivotGridRS23;rbUSERDesign1723;dxSkinsdxDLPainterRS23;IndyIPClient;dxRibbonRS23;dxPScxVGridLnkRS23;bindcompvcl;frxDB23;vcldbx;dxSkinOffice2007SilverRS23;dxPScxTLLnkRS23;dxMapControlRS23;TeeUI;rbDIDE1723;JvPascalInterpreter;JvDocking;VclSmp;dxPScxSchedulerLnkRS23;cxTreeListRS23;FireDACODBCDriver;JclVcl;DataSnapIndy10ServerTransport;dxRibbonCustomizationFormRS23;dxPSRichEditControlLnkRS23;dxBarExtDBItemsRS23;DataSnapProviderClient;FireDACMongoDBDriver;dxSkiniMaginaryRS23;frx23;dxSpellCheckerRS23;JvControls;dxSkinsdxBarPainterRS23;JvPrintPreview;dxSkinCoffeeRS23;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;rbRTL1723;dxADOServerModeRS23;emsclientfiredac;DataSnapFireDAC;svnui;dxmdsRS23;dxSkinLiquidSkyRS23;dxdbtrRS23;dxSkinSpringTimeRS23;dxPSDBTeeChartRS23;JvGlobus;HOAsysR;dxSkinscxPCPainterRS23;dxPSCoreRS23;DBXMSSQLDriver;JvMM;dxSkinXmas2008BlueRS23;rbDAD1723;DatasnapConnectorsFreePascal;bindcompfmx;JvNet;DBXOracleDriver;dxSkinSilverRS23;dxSkinValentineRS23;inetdb;JvAppFrm;ipstudiowinwordxp;rbTC1723;FmxTeeUI;dxBarExtItemsRS23;FireDACIBDriver;fmx;fmxdae;DelphiCookbookListViewAppearance;dxServerModeRS23;dxPsPrVwAdvRS23;dxSkinOffice2010BlackRS23;JvWizards;cxPageControlRS23;dxSkinStardustRS23;cxSchedulerGridRS23;dbexpress;IndyCore;dxSkinSharpPlusRS23;UIBD21Win32R;JvPageComps;dsnap;DataSnapCommon;emsclient;FireDACCommon;dxSkinOffice2010BlueRS23;bdertl;JvDB;dxSkinVS2010RS23;dxSkinMetropolisRS23;DataSnapConnectors;cxVerticalGridRS23;soapserver;dxSkinCaramelRS23;frxTee23;dxTileControlRS23;JclDeveloperTools;cxGridRS23;CPortLibDXE;FireDACOracleDriver;DBXMySQLDriver;JvCmp;rbFireDAC1723;DBXFirebirdDriver;FireDACCommonDriver;rbTCUI1723;LockBoxDR;inet;IndyIPCommon;JvCustom;dxSkinDarkRoomRS23;dxDockingRS23;vcl;dxSkinOffice2007GreenRS23;dxPScxExtCommonRS23;JvXPCtrls;dxSkinsCoreRS23;FireDACDb2Driver;dxThemeRS23;dxSkinsdxRibbonPainterRS23;dxSkinVisualStudio2013BlueRS23;rbRest1723;TSG5201;dxSkinMoneyTwinsRS23;dxPSdxFCLnkRS23;dxtrmdRS23;TeeDB;FireDAC;cxSchedulerTreeBrowserRS23;JvCore;dxFireDACServerModeRS23;dxSkinBlueRS23;OverbyteIcsD10SRun;JvCrypt;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;cxEditorsRS23;dxSkinGlassOceansRS23;JvDlgs;JvRuntimeDesign;dxSkinsdxNavBarPainterRS23;dxGaugeControlRS23;ibxpress;Tee;dxSkinSharpRS23;DataSnapServer;ibxbindings;cxPivotGridOLAPRS23;rbIDE1723;vclwinx;FireDACDSDriver;dxSkinBlueprintRS23;dxSkinOffice2007BlackRS23;CustomIPTransport;vcldsnap;rbBDE1723;dxSkinOffice2013LightGrayRS23;bindcomp;DBXInformixDriver;officeXPrt;dxPSdxGaugeControlLnkRS23;dxPScxPivotGridLnkRS23;dxorgcRS23;dxPSdxDBTVLnkRS23;dclRBADO1723;vclribbon;dbxcds;KernowSoftwareFMX;adortl;dclRBFireDAC1723;dclRBE1723;dxComnRS23;dsnapxml;dbrtl;inetdbxpress;IndyProtocols;cxExportRS23;dxSkinOffice2016DarkRS23;JclContainers;dxSkinVisualStudio2013DarkRS23;rbRCL1723;dxSkinscxSchedulerPainterRS23;rbRIDE1723;fmxase;$(DCC_UsePackage)</DCC_UsePackage>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<DCC_ExeOutput>.\bin</DCC_ExeOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
<DCC_UsePackage>DBXSqliteDriver;DBXDb2Driver;dxCoreRS23;vclactnband;vclFireDAC;dxPSLnksRS23;dxPSdxLCLnkRS23;tethering;cxDataRS23;dxPSdxOCLnkRS23;dxTabbedMDIRS23;FireDACADSDriver;dxSkinBlackRS23;dxSkinLondonLiquidSkyRS23;dxDBXServerModeRS23;dxHttpIndyRequestRS23;dxPScxGridLnkRS23;cxSchedulerRS23;FireDACMSSQLDriver;vcltouch;vcldb;dxWizardControlRS23;dxSkinMcSkinRS23;dxPScxCommonRS23;Intraweb;dxSkinOffice2007BlueRS23;dxBarRS23;cxSchedulerRibbonStyleEventEditorRS23;dxSkinOffice2013WhiteRS23;dxPSTeeChartRS23;cxLibraryRS23;dxSkinVisualStudio2013LightRS23;vclib;cxPivotGridChartRS23;dxSkinSummer2008RS23;dxPSdxDBOCLnkRS23;dxGDIPlusRS23;dxSkinDarkSideRS23;FireDACDBXDriver;dxSkinFoggyRS23;dxSkinSevenRS23;vclx;dxSkinOffice2010SilverRS23;dxdborRS23;RESTBackendComponents;dxLayoutControlRS23;dxPSPrVwRibbonRS23;VCLRESTComponents;dxSkinDevExpressStyleRS23;dxSkinWhiteprintRS23;vclie;bindengine;CloudService;FireDACMySQLDriver;dxSkinOffice2013DarkGrayRS23;DataSnapClient;dxPScxPCProdRS23;bindcompdbx;DBXSybaseASEDriver;IndyIPServer;dxSkinPumpkinRS23;IndySystem;dsnapcon;cxTreeListdxBarPopupMenuRS23;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSkinLilianRS23;dxBarDBNavRS23;dxFlowChartRS23;dxSkinOffice2016ColorfulRS23;DBXOdbcDriver;FireDACTDataDriver;FMXTee;ipstudiowinclient;soaprtl;DbxCommonDriver;dxSpreadSheetRS23;AsyncProDR;dxSkinOffice2007PinkRS23;dxPSdxSpreadSheetLnkRS23;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;dxSkinHighContrastRS23;rtl;dxSkinSevenClassicRS23;DbxClientDriver;dxSkinDevExpressDarkStyleRS23;DBXSybaseASADriver;dxNavBarRS23;dxSkinMetropolisDarkRS23;dxSkinTheAsphaltWorldRS23;dxRichEditControlRS23;ipstudiowin;appanalytics;cxPivotGridRS23;dxSkinsdxDLPainterRS23;IndyIPClient;dxRibbonRS23;dxPScxVGridLnkRS23;bindcompvcl;dxSkinOffice2007SilverRS23;dxPScxTLLnkRS23;dxMapControlRS23;TeeUI;VclSmp;dxPScxSchedulerLnkRS23;cxTreeListRS23;FireDACODBCDriver;DataSnapIndy10ServerTransport;dxRibbonCustomizationFormRS23;dxPSRichEditControlLnkRS23;dxBarExtDBItemsRS23;DataSnapProviderClient;FireDACMongoDBDriver;dxSkiniMaginaryRS23;dxSpellCheckerRS23;dxSkinsdxBarPainterRS23;dxSkinCoffeeRS23;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxADOServerModeRS23;emsclientfiredac;DataSnapFireDAC;dxmdsRS23;dxSkinLiquidSkyRS23;dxdbtrRS23;dxSkinSpringTimeRS23;dxPSDBTeeChartRS23;dxSkinscxPCPainterRS23;dxPSCoreRS23;DBXMSSQLDriver;dxSkinXmas2008BlueRS23;DatasnapConnectorsFreePascal;bindcompfmx;DBXOracleDriver;dxSkinSilverRS23;dxSkinValentineRS23;inetdb;FmxTeeUI;dxBarExtItemsRS23;FireDACIBDriver;fmx;fmxdae;dxServerModeRS23;dxPsPrVwAdvRS23;dxSkinOffice2010BlackRS23;cxPageControlRS23;dxSkinStardustRS23;cxSchedulerGridRS23;dbexpress;IndyCore;dxSkinSharpPlusRS23;dsnap;DataSnapCommon;emsclient;FireDACCommon;dxSkinOffice2010BlueRS23;dxSkinVS2010RS23;dxSkinMetropolisRS23;DataSnapConnectors;cxVerticalGridRS23;soapserver;dxSkinCaramelRS23;dxTileControlRS23;cxGridRS23;FireDACOracleDriver;DBXMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;LockBoxDR;inet;IndyIPCommon;dxSkinDarkRoomRS23;dxDockingRS23;vcl;dxSkinOffice2007GreenRS23;dxPScxExtCommonRS23;dxSkinsCoreRS23;FireDACDb2Driver;dxThemeRS23;dxSkinsdxRibbonPainterRS23;dxSkinVisualStudio2013BlueRS23;dxSkinMoneyTwinsRS23;dxPSdxFCLnkRS23;dxtrmdRS23;TeeDB;FireDAC;cxSchedulerTreeBrowserRS23;dxFireDACServerModeRS23;dxSkinBlueRS23;OverbyteIcsD10SRun;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;cxEditorsRS23;dxSkinGlassOceansRS23;dxSkinsdxNavBarPainterRS23;dxGaugeControlRS23;ibxpress;Tee;dxSkinSharpRS23;DataSnapServer;ibxbindings;cxPivotGridOLAPRS23;vclwinx;FireDACDSDriver;dxSkinBlueprintRS23;dxSkinOffice2007BlackRS23;CustomIPTransport;vcldsnap;dxSkinOffice2013LightGrayRS23;bindcomp;DBXInformixDriver;officeXPrt;dxPSdxGaugeControlLnkRS23;dxPScxPivotGridLnkRS23;dxorgcRS23;dxPSdxDBTVLnkRS23;vclribbon;dbxcds;adortl;dxComnRS23;dsnapxml;dbrtl;inetdbxpress;IndyProtocols;cxExportRS23;dxSkinOffice2016DarkRS23;dxSkinVisualStudio2013DarkRS23;dxSkinscxSchedulerPainterRS23;fmxase;$(DCC_UsePackage)</DCC_UsePackage>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_DebugDCUs>true</DCC_DebugDCUs>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_Locale>1033</VerInfo_Locale>
<AppEnableHighDPI>true</AppEnableHighDPI>
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<DCC_RemoteDebug>false</DCC_RemoteDebug>
<VerInfo_Keys>CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>0</DCC_DebugInformation>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<AppEnableHighDPI>true</AppEnableHighDPI>
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="MainFormU.pas">
<Form>MainForm</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="LoggerProConfig.pas"/>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>Application</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">email_appender.dpr</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k250.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp250.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k250.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp250.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
<Deployment Version="3">
<DeployFile LocalName="Win32\Debug\email_appender.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>email_appender.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidClassesDexFile">
<Platform Name="Android">
<RemoteDir>classes</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidGDBServer">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiFile">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeMipsFile">
<Platform Name="Android">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeX86File"/>
<DeployClass Name="AndroidServiceOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDef">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStyles">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon144">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage426">
<Platform Name="Android">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage470">
<Platform Name="Android">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage640">
<Platform Name="Android">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage960">
<Platform Name="Android">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyFramework">
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyModule">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.dll;.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="DependencyPackage">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Name="File">
<Platform Name="Android">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1024">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1536">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2048">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch768">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch320">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640x1136">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceResourceRules">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSEntitlements">
<Platform Name="iOSDevice32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSInfoPList">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXEntitlements">
<Platform Name="OSX32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXInfoPList">
<Platform Name="OSX32">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXResource">
<Platform Name="OSX32">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="ProjectOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="Linux64">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectUWPManifest">
<Platform Name="Win32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo150">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo44">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
</Deployment>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
</Project>

View File

@ -1,30 +0,0 @@
unit LoggerProConfig;
interface
uses
LoggerPro, LoggerPro.UDPSyslogAppender;
var
Log: ILogWriter;
Appender: TLoggerProUDPSyslogAppender;
implementation
initialization
Appender := TLoggerProUDPSyslogAppender.Create(
'127.0.0.1'
, 5114 //UDPClientPort.Value
, 'COMPUTER'
, 'USER'
, 'EXE'
, '0.0.1'
, ''
, True
, False
);
Log := BuildLogWriter([Appender]);
end.

View File

@ -1,166 +0,0 @@
object FUDPServerClientForm: TFUDPServerClientForm
Left = 0
Top = 0
Caption = 'UDP Server & Client'
ClientHeight = 624
ClientWidth = 1138
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 0
Top = 0
Width = 1138
Height = 19
Align = alTop
Caption = 'Switch on the UDP server to listen to broadcasts on 127.0.0.1.'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
ExplicitWidth = 442
end
object Label2: TLabel
Left = 0
Top = 19
Width = 1138
Height = 19
Align = alTop
Caption =
'Also switch on the UDP client to start broadcasting logs to 127.' +
'0.0.1.'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
ExplicitWidth = 490
end
object Label3: TLabel
Left = 0
Top = 38
Width = 1138
Height = 19
Align = alTop
Caption = 'Watch server log below to see received syslog messages.'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
ExplicitWidth = 402
end
object UDPServerReceived: TMemo
Left = 0
Top = 170
Width = 1138
Height = 454
Align = alClient
Color = clBackground
Font.Charset = DEFAULT_CHARSET
Font.Color = clLime
Font.Height = -16
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 0
end
object Panel1: TPanel
Left = 0
Top = 57
Width = 1138
Height = 113
Align = alTop
BevelInner = bvLowered
TabOrder = 1
object Label4: TLabel
Left = 8
Top = 6
Width = 73
Height = 13
Caption = 'UDP Client Port'
end
object Label5: TLabel
Left = 240
Top = 6
Width = 78
Height = 13
Caption = 'UDP Server Port'
end
object UDPServerControl: TRadioGroup
Left = 367
Top = 2
Width = 100
Height = 105
Caption = 'UDP Server'
ItemIndex = 1
Items.Strings = (
'On'
'Off')
TabOrder = 0
OnClick = UDPServerControlClick
end
object UDPClientControl: TRadioGroup
Left = 134
Top = 2
Width = 100
Height = 105
Caption = 'UDP Client'
ItemIndex = 1
Items.Strings = (
'On'
'Off')
TabOrder = 1
OnClick = UDPClientControlClick
end
object UDPClientPort: TSpinEdit
Left = 8
Top = 25
Width = 121
Height = 22
MaxValue = 0
MinValue = 0
TabOrder = 2
Value = 5114
end
object UDPServerPort: TSpinEdit
Left = 240
Top = 25
Width = 121
Height = 22
MaxValue = 0
MinValue = 0
TabOrder = 3
Value = 5114
end
end
object IdUDPServer: TIdUDPServer
Bindings = <
item
IP = '127.0.0.1'
Port = 5114
end>
DefaultPort = 0
OnUDPRead = IdUDPServerUDPRead
Left = 536
Top = 8
end
object UDPClientTimer: TTimer
Enabled = False
OnTimer = UDPClientTimerTimer
Left = 616
Top = 8
end
end

View File

@ -1,97 +0,0 @@
unit UDPServerClientForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
IdUDPBase, IdUDPServer, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Samples.Spin,
IdGlobal, IdSocketHandle, LoggerPro.UDPSyslogAppender;
type
TFUDPServerClientForm = class(TForm)
IdUDPServer: TIdUDPServer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
UDPServerReceived: TMemo;
Panel1: TPanel;
UDPServerControl: TRadioGroup;
UDPClientControl: TRadioGroup;
UDPClientPort: TSpinEdit;
Label4: TLabel;
Label5: TLabel;
UDPServerPort: TSpinEdit;
UDPClientTimer: TTimer;
procedure UDPClientTimerTimer(Sender: TObject);
procedure UDPClientControlClick(Sender: TObject);
procedure UDPServerControlClick(Sender: TObject);
procedure IdUDPServerUDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
public
{ Public declarations }
end;
var
FUDPServerClientForm: TFUDPServerClientForm;
implementation
uses
LoggerPro, LoggerProConfig, Math;
const
STATUS_ON = 0;
STATUS_OFF = 1;
{$R *.dfm}
function GetPIDByHWND(const hWnd: THandle): THandle;
var
PID: DWORD;
begin
Result := 0;
if hWnd = 0 then Exit;
GetWindowThreadProcessID(hWnd, @PID);
Result := PID;
end;
procedure TFUDPServerClientForm.IdUDPServerUDPRead(
AThread: TIdUDPListenerThread; const AData: TIdBytes;
ABinding: TIdSocketHandle);
begin
UDPServerReceived.Lines.Add(BytesToString(AData, IndyTextEncoding_UTF8));
UDPServerReceived.Lines.Add('----------------');
SendMessage(UDPServerReceived.Handle, EM_LINESCROLL, 0, UDPServerReceived.Lines.Count);
end;
procedure TFUDPServerClientForm.UDPClientControlClick(Sender: TObject);
begin
UDPClientTimer.Enabled := UDPClientControl.ItemIndex = STATUS_ON;
if not UDPClientTimer.Enabled then Exit;
Appender.ProcID := IntToStr(GetPIDByHWND(Application.Handle));
Appender.Port := UDPClientPort.Value;
Appender.UserName := GetEnvironmentVariable('USERNAME');
Appender.HostName := GetEnvironmentVariable('COMPUTERNAME');
Appender.Application := ExtractFileName(ParamStr(0));
end;
procedure TFUDPServerClientForm.UDPClientTimerTimer(Sender: TObject);
begin
case RandomRange(0, 5) of
0: Log.Debug('debug message', 'DEBUG');
1: Log.Info('info message', 'INFO');
2: Log.Warn('warn message', 'WARN');
3: Log.Error('error message', 'ERROR');
4: Log.Info('Some Access Violation', 'INFO');
end;
end;
procedure TFUDPServerClientForm.UDPServerControlClick(Sender: TObject);
begin
IdUDPServer.Bindings[0].Port := UDPServerPort.Value;
IdUDPServer.Active := UDPServerControl.ItemIndex = STATUS_ON;
end;
end.

View File

@ -1,15 +0,0 @@
program udp_syslog;
uses
Vcl.Forms,
UDPServerClientForm in 'UDPServerClientForm.pas' {FUDPServerClientForm},
LoggerProConfig in 'LoggerProConfig.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFUDPServerClientForm, FUDPServerClientForm);
Application.Run;
end.

File diff suppressed because it is too large Load Diff

View File

@ -1,42 +0,0 @@
unit LoggerProConfig;
interface
uses
LoggerPro;
function Log: ILogWriter;
implementation
uses
LoggerPro.FileAppender,
LoggerPro.ConsoleAppender,
LoggerPro.OutputDebugStringAppender;
var
_Log: ILogWriter;
function Log: ILogWriter;
begin
Result := _Log;
end;
procedure SetupLogger;
const
{$IFDEF DEBUG}
LOG_LEVEL = TLogType.Debug;
{$ELSE}
LOG_LEVEL = TLogType.Warning;
{$ENDIF}
begin
_Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProConsoleAppender.Create,
TLoggerProOutputDebugStringAppender.Create], nil, LOG_LEVEL);
end;
initialization
SetupLogger;
end.

View File

@ -1,16 +0,0 @@
program multiple_appenders;
uses
Vcl.Forms,
LoggerProConfig in 'LoggerProConfig.pas',
MainFormU in '..\common\MainFormU.pas' {MainForm};
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -1,70 +0,0 @@
unit LoggerProConfig;
interface
uses
LoggerPro;
const
{$IF Defined(MSWINDOWS)}
REST_LOGS_COLLECTOR_URL = 'http://localhost:8080';
{$ENDIF}
{$IF Defined(Android)}
REST_LOGS_COLLECTOR_URL = 'http://192.168.1.7:8080';
{$ENDIF}
function Log: ILogWriter;
implementation
uses
LoggerPro.RESTAppender,
LoggerPro.FileAppender,
System.Net.HttpClient,
System.SysUtils;
var
_Log: ILogWriter;
_Events: TLoggerProEventsHandler;
_RESTAppender: ILogAppender;
function Log: ILogWriter;
begin
Result := _Log;
end;
initialization
_Events := TLoggerProEventsHandler.Create;
_Events.OnAppenderError :=
procedure(const AppenderClassName: string; const aFailedLogItem: TLogItem;
const Reason: TLogErrorReason; var Action: TLogErrorAction)
begin
Action := TLogErrorAction.DiscardOlder;
end;
DefaultLoggerProAppenderQueueSize := 10;
_RESTAppender := TLoggerProRESTAppender.Create(REST_LOGS_COLLECTOR_URL + '/api/logs');
TLoggerProRESTAppender(_RESTAppender).OnNetSendError :=
procedure(const Sender: TObject; const LogItem: TLogItem; const NetError: Exception;
var RetryCount: Integer)
begin
// retries to send log for 5 times, then discard the logitem
if RetryCount = 5 then
begin
RetryCount := 0
end
else
begin
Inc(RetryCount);
end;
end;
_Log := BuildLogWriter([_RESTAppender, TLoggerProFileAppender.Create], _Events);
finalization
_Log := nil;
_Events.Free;
end.

View File

@ -1,62 +0,0 @@
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'LoggerPro SAMPLE'
ClientHeight = 142
ClientWidth = 584
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Visible = True
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 8
Top = 8
Width = 137
Height = 57
Caption = 'DEBUG'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 151
Top = 8
Width = 137
Height = 57
Caption = 'INFO'
TabOrder = 1
OnClick = Button2Click
end
object Button3: TButton
Left = 294
Top = 8
Width = 137
Height = 57
Caption = 'WARNING'
TabOrder = 2
OnClick = Button3Click
end
object Button4: TButton
Left = 437
Top = 8
Width = 137
Height = 57
Caption = 'ERROR'
TabOrder = 3
OnClick = Button4Click
end
object Button5: TButton
Left = 8
Top = 71
Width = 280
Height = 57
Caption = 'Multithread logging'
TabOrder = 4
OnClick = Button5Click
end
end

View File

@ -1,91 +0,0 @@
unit RESTAppenderFormU;
interface
uses
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
LoggerPro,
Vcl.ExtCtrls;
type
TMainForm = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
uses
LoggerProConfig;
procedure TMainForm.Button1Click(Sender: TObject);
begin
Log.Debug('This is a debug message with TAG1', 'TAG1');
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
Log.Info('This is a info message with TAG1', 'TAG1');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
Log.Warn('This is a warning message with TAG1', 'TAG1');
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin
Log.Error('This is a error message with TAG1', 'TAG1');
end;
procedure TMainForm.Button5Click(Sender: TObject);
var
lThreadProc: TProc;
begin
lThreadProc := procedure
var
I: Integer;
lThreadID: string;
begin
lThreadID := IntToStr(TThread.Current.ThreadID);
for I := 1 to 100 do
begin
Log.Debug('log message %s ThreadID: %s', [TimeToStr(now), lThreadID], 'MULTITHREADING');
Log.Info('log message %s ThreadID: %s', [TimeToStr(now), lThreadID], 'MULTITHREADING');
Log.Warn('log message %s ThreadID: %s', [TimeToStr(now), lThreadID], 'MULTITHREADING');
Log.Error('log message %s ThreadID: %s', [TimeToStr(now), lThreadID], 'MULTITHREADING');
end;
end;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
TThread.CreateAnonymousThread(lThreadProc).Start;
end;
end.

View File

@ -1,16 +0,0 @@
program RESTAppenderSample;
uses
Vcl.Forms,
RESTAppenderFormU in 'RESTAppenderFormU.pas' {MainForm},
LoggerProConfig in 'LoggerProConfig.pas',
LoggerPro.RESTAppender in '..\..\LoggerPro.RESTAppender.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -1,48 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{5BA437FC-4365-4824-8F39-36A3387CD280}</ProjectGuid>
</PropertyGroup>
<ItemGroup>
<Projects Include="RESTAppenderSample.dproj">
<Dependencies/>
</Projects>
<Projects Include="..\rest_logs_collector\RESTLogsCollector.dproj">
<Dependencies/>
</Projects>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Default.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Default.Personality/>
</BorlandProject>
</ProjectExtensions>
<Target Name="RESTAppenderSample">
<MSBuild Projects="RESTAppenderSample.dproj"/>
</Target>
<Target Name="RESTAppenderSample:Clean">
<MSBuild Projects="RESTAppenderSample.dproj" Targets="Clean"/>
</Target>
<Target Name="RESTAppenderSample:Make">
<MSBuild Projects="RESTAppenderSample.dproj" Targets="Make"/>
</Target>
<Target Name="RESTLogsCollector">
<MSBuild Projects="..\rest_logs_collector\RESTLogsCollector.dproj"/>
</Target>
<Target Name="RESTLogsCollector:Clean">
<MSBuild Projects="..\rest_logs_collector\RESTLogsCollector.dproj" Targets="Clean"/>
</Target>
<Target Name="RESTLogsCollector:Make">
<MSBuild Projects="..\rest_logs_collector\RESTLogsCollector.dproj" Targets="Make"/>
</Target>
<Target Name="Build">
<CallTarget Targets="RESTAppenderSample;RESTLogsCollector"/>
</Target>
<Target Name="Clean">
<CallTarget Targets="RESTAppenderSample:Clean;RESTLogsCollector:Clean"/>
</Target>
<Target Name="Make">
<CallTarget Targets="RESTAppenderSample:Make;RESTLogsCollector:Make"/>
</Target>
<Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/>
</Project>

View File

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.embarcadero.RESTAppenderMobileSample"
android:versionCode="1"
android:versionName="1.0.0"
android:installLocation="auto">
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="False"
android:usesCleartextTraffic="true"
android:restoreAnyVersion="False"
android:label="RESTAppenderMobileSample"
android:debuggable="True"
android:largeHeap="False"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme"
android:hardwareAccelerated="true">
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="RESTAppenderMobileSample"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="RESTAppenderMobileSample" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->

View File

@ -1,43 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="%package%"
android:versionCode="%versionCode%"
android:versionName="%versionName%"
android:installLocation="%installLocation%">
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%>
<uses-feature android:glEsVersion="0x00020000" android:required="True"/>
<application android:persistent="%persistent%"
android:usesCleartextTraffic="true"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%"
android:hardwareAccelerated="%hardwareAccelerated%">
<%application-meta-data%>
<%services%>
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name"
android:value="%libNameValue%" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<%activity%>
<%receivers%>
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->

View File

@ -1,96 +0,0 @@
object Form2: TForm2
Left = 0
Top = 0
Caption = 'Form2'
ClientHeight = 569
ClientWidth = 343
Padding.Left = 10.000000000000000000
Padding.Top = 10.000000000000000000
Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
DesignerMasterStyle = 3
object btnDEBUG: TButton
Align = Top
Margins.Left = 5.000000000000000000
Margins.Top = 5.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 15.000000000000000000
Position.Y = 54.000000000000000000
Size.Width = 313.000000000000000000
Size.Height = 57.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Text = 'Send DEBUG Message'
OnClick = btnDEBUGClick
Left = 8
Top = 8
end
object btnWARNING: TButton
Align = Top
Margins.Left = 5.000000000000000000
Margins.Top = 5.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 15.000000000000000000
Position.Y = 188.000000000000000000
Size.Width = 313.000000000000000000
Size.Height = 57.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Text = 'Send WARNING Message'
OnClick = btnWARNINGClick
Left = 151
Top = 8
end
object btnINFO: TButton
Align = Top
Margins.Left = 5.000000000000000000
Margins.Top = 5.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 15.000000000000000000
Position.Y = 121.000000000000000000
Size.Width = 313.000000000000000000
Size.Height = 57.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
Text = 'Send INFO Message'
OnClick = btnINFOClick
Left = 294
Top = 8
end
object btnERROR: TButton
Align = Top
Margins.Left = 5.000000000000000000
Margins.Top = 5.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 15.000000000000000000
Position.Y = 255.000000000000000000
Size.Width = 313.000000000000000000
Size.Height = 57.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
Text = 'Send ERROR Message'
OnClick = btnERRORClick
Left = 437
Top = 8
end
object Label1: TLabel
Align = MostTop
Position.X = 10.000000000000000000
Position.Y = 10.000000000000000000
Size.Width = 323.000000000000000000
Size.Height = 39.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'listboxheaderlabel'
TextSettings.HorzAlign = Center
Text = 'LoggerPro - REST Appender DEMO'
TabOrder = 4
end
end

Some files were not shown because too many files have changed in this diff Show More