Logging y sincronización

Acabo de escribir mi propio marco de registro (muy ligero, sin necesidad de un gran marco de registro). Consiste en una interfaz ILogger y una serie de clases que implementan esa interfaz. Sobre el que tengo una pregunta es sobre TGUILogger, que toma un TStrings como el objetivo de registro y sincroniza el registro con el hilo principal para que el miembro Elementos de un cuadro de lista pueda usarse como el objetivo.

type
  ILogger = Interface (IInterface)
    procedure Log (const LogString : String; LogLevel : TLogLevel);
    procedure SetLoggingLevel (LogLevel : TLogLevel);
  end;

type    
  TGUILogger = class (TInterfacedObject, ILogger)
  public
    constructor Create (Target : TStrings);
    procedure Log (const LogString : String; LogLevel : TLogLevel);
    procedure SetLoggingLevel (LogLevel : TLogLevel);
  private
    procedure PerformLogging;
  end;

procedure TGUILogger.Log (const LogString : String; LogLevel : TLogLevel);
begin
  TMonitor.Enter (Self);
  try
    FLogString := GetDateTimeString + ' ' + LogString;
    TThread.Synchronize (TThread.CurrentThread, PerformLogging);
  finally
    TMonitor.Exit (Self);
  end;
end;

procedure TGUILogger.PerformLogging;
begin
  FTarget.Add (FLogString);
end;

El registro funciona, pero la aplicación no se cierra correctamente. Parece colgar en la unidad de clases. El seguimiento de la pila:

System.Halt0, System.FinalizeUnits, Classes.Finalization, Classes.FreeExternalThreads, System.TObject.Free, Classes.TThread.Destroy, Classes.TThread.RemoveQueuedEvents

¿Qué estoy haciendo mal aquí

EDIT: acabo de encontrar la siguiente pista en la ayuda de Delphi para TThread.StaticSynchronize

Warning: Do not call StaticSynchronize from within the main thread. This can cause 
an infinite loop.     

Esto podría ser exactamente mi problema, ya que algunas solicitudes de registro provienen del hilo principal. ¿Como puedo resolver esto

Respuestas a la pregunta(2)

Su respuesta a la pregunta