2017-01-11 5 views
4

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...).

Antwort

3

TFileLogAppender kann von mehreren Threads zur selben Zeit verwendet werden, da es von TStreamLogAppender ableitet, die eine TCriticalSection in seiner DoSend Verfahren, um multithreading bezogene Probleme zu vermeiden, verwendet.

TTextLogAppenderhat keine Instanz TCriticalSection bei der Umsetzung von DoSend verwenden. Also ich denke nicht, dass es in mehreren Threads gleichzeitig arbeiten soll.

+2

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. –

+1

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). –

+0

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. –