Ist es eine globale-globale (
) Variable oder eine variable, die nur in der Implementation einer
Unit steckt?
Wenn letzteres, ann könntest du ja eine Funktion zur Verfügung stellen, die lesenden Zugriff auf das Log gewährt.
Den globale variablen, die jeder lesen und schreiben kann sind ziemlicher Mist, denn die kannst du gar nicht absichern.
Grob vereinfacht, wäre sowas hier möglich:
Delphi-Quellcode:
type
TLog = class
...
public
procedure Log(...); virtual; abstract;
class function GetLog : TLog;
class procedure RegisterLogHandler(logHandler : TLog);
end;
implementation
var
globalLogInstance : TLog
type
TAggregatedLog = class(TLog)
...
public
property LogHandlers : TObjectList...;
procedure Log(...); override;
...
end;
...
class procedure TAggregatedLog.RegisterLogHandler(logHandler : TLog);
begin
EnterCriticalSection(lpLogCS);
try
LogHandlers[i].Add(logHandler);
finally
LeaveCriticalSection(lpLogCS);
end;
end;
procedure TAggregatedLog.Log(...) : TLog;
var
i : Integer;
begin
EnterCriticalSection(lpLogCS);
try
for i := 0 LogHandlers.Count - 1 do
Tlog(LogHandlers[i]).Log(...);
finally
LeaveCriticalSection(lpLogCS);
end;
end;
class function GetLog : TLog;
begin
result := globalLogInstance;
end;
initialization
globalLogInstance := TAggregatedLog.Create();
finalization
globalLogInstance.Free();
end.
einmal so verpackt, könntest du beliebige Logger zur laufzeit registrieren.
Und die Instanz in der
Unit würde mit allen einen Log-Eintrag generieren, ohne dass der zu benutzende Code etwas davn wissen muss. (Zum Bleistift Eventlog, Dateilog, Kommandozeile, email, ...)
Da du jetzt keine öffentlich beschreibare globale Variable nutzt, könntest du dann in der Methode zum Registrieren die gleiche CriticalSection nutzen. Einfach um sicher zu stellen, dass nix halbes ausgeführt wird.
Aber wozu der Stress, ich dachte es gibt bereits ein LogForDelphi?