-
Notifications
You must be signed in to change notification settings - Fork 100
Expand file tree
/
Copy pathLoggerPro.GlobalLogger.pas
More file actions
99 lines (83 loc) · 2.42 KB
/
Copy pathLoggerPro.GlobalLogger.pas
File metadata and controls
99 lines (83 loc) · 2.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// *************************************************************************** }
//
// LoggerPro
//
// Copyright (c) 2010-2026 Daniele Teti
//
// https://github.com/danieleteti/loggerpro
//
// ***************************************************************************
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// ***************************************************************************
unit LoggerPro.GlobalLogger;
interface
uses
LoggerPro;
{ @abstract(The global logger. Just use Log and start logging!)
The global logger is configured with a TLoggerProFileAppender using default settings.
}
function Log: ILogWriter;
{ @abstract(Use only inside DLL because dll unloading is not a safe place to shutdown threads)
Call this before unloading a DLL. Also use in ISAPI dll.
Check the loggerproisapisample.dll sample.
}
procedure ReleaseGlobalLogger;
implementation
uses
LoggerPro.FileAppender;
var
_Logger: ILogWriter = nil;
_Lock: TObject = nil;
_Finalized: Boolean = False;
function Log: ILogWriter;
begin
// After finalization, don't create new loggers
if _Finalized then
Exit(nil);
if _Logger = nil then
begin
TMonitor.Enter(_Lock);
try
if _Logger = nil then
begin
{$WARN SYMBOL_DEPRECATED OFF}
_Logger := BuildLogWriter([TLoggerProFileAppender.Create]);
{$WARN SYMBOL_DEPRECATED ON}
end;
finally
TMonitor.Exit(_Lock);
end;
end;
Result := _Logger;
end;
procedure ReleaseGlobalLogger;
begin
TMonitor.Enter(_Lock);
try
_Finalized := True;
// Release the logger. Its destructor will wait for all
// pending logs to be written before terminating.
_Logger := nil;
finally
TMonitor.Exit(_Lock);
end;
end;
initialization
_Lock := TObject.Create;
finalization
ReleaseGlobalLogger;
// Note: We don't free _Lock here because a thread might still be
// trying to acquire it. The OS will clean it up when the process exits.
end.