Ist der Logging-Mechanismus von Spring4D Thread-Safe? (Einheiten Spring.Logging. *, nehme ich an)Ist der Protokollierungsmechanismus von Spring4D threadsicher? (Einheiten Spring.Logging. *, nehme ich an)
Zum Beispiel können mehrere Threads lösen und verwenden Sie eine Implementierung für aus dem folgenden Container?
uses
System.SysUtils,
Spring.Container,
Spring.Logging,
Spring.Logging.Appenders,
Spring.Logging.Controller,
Spring.Logging.Loggers;
var
Container: TContainer;
TextLogAppender: TTextLogAppender;
FileLogAppender: TFileLogAppender;
LoggerController: TLoggerController;
LoggerInThread1: ILogger;
LoggerInThread2: ILogger;
begin
TextLogAppender := TTextLogAppender.Create;
FileLogAppender := TFileLogAppender.Create;
FileLogAppender.FileName := 'Log.txt';
LoggerController := TLoggerController.Create;
LoggerController.AddAppender(TextLogAppender as ILogAppender);
LoggerController.AddAppender(FileLogAppender as ILogAppender);
Container := TContainer.Create;
try
Container.RegisterInstance<ILoggerController>(LoggerController);
Container.RegisterType<ILogger, TLogger>;
Container.Build;
LoggerInThread1 := Container.Resolve<ILogger>;
LoggerInThread2 := Container.Resolve<ILogger>;
{$Region 'threaded code'}
LoggerInThread1.Info('Hello from Thread 1!');
LoggerInThread2.Info('Hello from Thread 2!');
{$EndRegion}
finally
Container.Free;
end;
end;
Mit Zweig release/1.2 (derzeit 33e3232...).
TTextLogAppender ist nicht Thread-sicher, da es Datei-I/O (aka Writeln) verwendet. Selbst das Einfügen eines CS würde nichts lösen, da mehrere Appender in dieselbe Datei schreiben könnten. Aus diesem Grund ist TStreamLogAppender auch nur Thread-sicher, wenn Sie keinen anderen haben, der denselben Stream verwendet. –
Um es zusammenzufassen: 'TFileLogAppender' ist threadsicher, da es den CS von' TStreamLogAppender' verwendet und es kein Risiko gibt, den Stream für andere Zwecke verfügbar zu machen, auch 'fmShareDenyWrite' Zugriff, der anderen das Schreiben verbietet Datei. 'TTextLogAppender' ist Thread-sicher, solange Sie es für stdout/stderr verwenden (möglicherweise plattformabhängig). Die anderen plattformspezifischen Appender sollten ebenfalls sicher sein (auch plattformabhängig). –
Ich muss mich selbst korrigieren, nach einigen Tests ist 'TTextLogAppender' ** nicht ** threadsicher aufgrund der internen RTL-Implementierung. Ich werde Locking für 1.2 hinzufügen, das das beheben wird, wenn die Protokollierung die einzige ist, die 'ErrOutput' verwendet. Ich habe ein [Problem] (https://bitbucket.org/sglienke/spring4d/issues/235) erstellt, das Sie nachverfolgen können. –