@@ -427,6 +427,7 @@ TCallbackAppenderConfigurator = class(TBaseAppenderConfigurator, ICallbackAppe
427427 FCallback: TLogItemCallback;
428428 FSynchronizeToMainThread: Boolean;
429429 public
430+ constructor Create(aBuilder: TLoggerProBuilder);
430431 function WithCallback (aCallback: TLogItemCallback): ICallbackAppenderConfigurator;
431432 function WithSynchronizeToMainThread (aValue: Boolean): ICallbackAppenderConfigurator;
432433 function WithLogLevel (aLogLevel: TLogType): ICallbackAppenderConfigurator;
@@ -568,6 +569,7 @@ TLoggerProBuilder = class(TInterfacedObject, ILoggerProBuilder)
568569 FDefaultRenderer: ILogItemRenderer;
569570 FDefaultTag: string;
570571 FStackTraceFormatter: TStackTraceFormatter;
572+ FPendingConfiguratorName: string;
571573 public
572574 constructor Create;
573575 destructor Destroy; override;
@@ -611,6 +613,8 @@ TLoggerProBuilder = class(TInterfacedObject, ILoggerProBuilder)
611613 // Used by configurators
612614 procedure InternalAddAppender (aAppender: ILogAppender);
613615 function GetDefaultRenderer : ILogItemRenderer;
616+ procedure SetPendingConfigurator (const aName: string);
617+ procedure ClearPendingConfigurator ;
614618 end ;
615619
616620{ TBaseAppenderConfigurator }
@@ -661,6 +665,17 @@ class function TLoggerProBuilder.New: ILoggerProBuilder;
661665procedure TLoggerProBuilder.InternalAddAppender (aAppender: ILogAppender);
662666begin
663667 FAppenders.Add(aAppender);
668+ ClearPendingConfigurator;
669+ end ;
670+
671+ procedure TLoggerProBuilder.SetPendingConfigurator (const aName: string);
672+ begin
673+ FPendingConfiguratorName := aName;
674+ end ;
675+
676+ procedure TLoggerProBuilder.ClearPendingConfigurator ;
677+ begin
678+ FPendingConfiguratorName := ' ' ;
664679end ;
665680
666681function TLoggerProBuilder.WriteToAppender (aAppender: ILogAppender): ILoggerProBuilder;
@@ -671,61 +686,73 @@ function TLoggerProBuilder.WriteToAppender(aAppender: ILogAppender): ILoggerProB
671686
672687function TLoggerProBuilder.WriteToConsole : IConsoleAppenderConfigurator;
673688begin
689+ SetPendingConfigurator(' WriteToConsole' );
674690 Result := TConsoleAppenderConfigurator.Create(Self);
675691end ;
676692
677693function TLoggerProBuilder.WriteToSimpleConsole : ISimpleConsoleAppenderConfigurator;
678694begin
695+ SetPendingConfigurator(' WriteToSimpleConsole' );
679696 Result := TSimpleConsoleAppenderConfigurator.Create(Self);
680697end ;
681698
682699function TLoggerProBuilder.WriteToFile : IFileAppenderConfigurator;
683700begin
701+ SetPendingConfigurator(' WriteToFile' );
684702 Result := TFileAppenderConfigurator.Create(Self);
685703end ;
686704
687705function TLoggerProBuilder.WriteToJSONLFile : IJSONLFileAppenderConfigurator;
688706begin
707+ SetPendingConfigurator(' WriteToJSONLFile' );
689708 Result := TJSONLFileAppenderConfigurator.Create(Self);
690709end ;
691710
692711function TLoggerProBuilder.WriteToTimeRotatingFile : ITimeRotatingFileAppenderConfigurator;
693712begin
713+ SetPendingConfigurator(' WriteToTimeRotatingFile' );
694714 Result := TTimeRotatingFileAppenderConfigurator.Create(Self);
695715end ;
696716
697717function TLoggerProBuilder.WriteToHTTP : IHTTPAppenderConfigurator;
698718begin
719+ SetPendingConfigurator(' WriteToHTTP' );
699720 Result := THTTPAppenderConfigurator.Create(Self);
700721end ;
701722
702723function TLoggerProBuilder.WriteToElasticSearch : IElasticSearchAppenderConfigurator;
703724begin
725+ SetPendingConfigurator(' WriteToElasticSearch' );
704726 Result := TElasticSearchAppenderConfigurator.Create(Self);
705727end ;
706728
707729function TLoggerProBuilder.WriteToMemory : IMemoryAppenderConfigurator;
708730begin
731+ SetPendingConfigurator(' WriteToMemory' );
709732 Result := TMemoryAppenderConfigurator.Create(Self);
710733end ;
711734
712735function TLoggerProBuilder.WriteToCallback : ICallbackAppenderConfigurator;
713736begin
737+ SetPendingConfigurator(' WriteToCallback' );
714738 Result := TCallbackAppenderConfigurator.Create(Self);
715739end ;
716740
717741function TLoggerProBuilder.WriteToSimpleCallback : ISimpleCallbackAppenderConfigurator;
718742begin
743+ SetPendingConfigurator(' WriteToSimpleCallback' );
719744 Result := TSimpleCallbackAppenderConfigurator.Create(Self);
720745end ;
721746
722747function TLoggerProBuilder.WriteToOutputDebugString : IOutputDebugStringAppenderConfigurator;
723748begin
749+ SetPendingConfigurator(' WriteToOutputDebugString' );
724750 Result := TOutputDebugStringAppenderConfigurator.Create(Self);
725751end ;
726752
727753function TLoggerProBuilder.WriteToUDPSyslog : IUDPSyslogAppenderConfigurator;
728754begin
755+ SetPendingConfigurator(' WriteToUDPSyslog' );
729756 Result := TUDPSyslogAppenderConfigurator.Create(Self);
730757end ;
731758
@@ -734,44 +761,51 @@ function TLoggerProBuilder.WriteToVCLMemo(aMemo: TObject): IVCLMemoAppenderConfi
734761begin
735762 if not (aMemo is TMemo) then
736763 raise ELoggerPro.Create(' WriteToVCLMemo requires a TMemo instance' );
764+ SetPendingConfigurator(' WriteToVCLMemo' );
737765 Result := TVCLMemoAppenderConfigurator.Create(Self, TMemo(aMemo));
738766end ;
739767
740768function TLoggerProBuilder.WriteToVCLListBox (aListBox: TObject): IVCLListBoxAppenderConfigurator;
741769begin
742770 if not (aListBox is TListBox) then
743771 raise ELoggerPro.Create(' WriteToVCLListBox requires a TListBox instance' );
772+ SetPendingConfigurator(' WriteToVCLListBox' );
744773 Result := TVCLListBoxAppenderConfigurator.Create(Self, TListBox(aListBox));
745774end ;
746775
747776function TLoggerProBuilder.WriteToVCLListView (aListView: TObject): IVCLListViewAppenderConfigurator;
748777begin
749778 if not (aListView is TListView) then
750779 raise ELoggerPro.Create(' WriteToVCLListView requires a TListView instance' );
780+ SetPendingConfigurator(' WriteToVCLListView' );
751781 Result := TVCLListViewAppenderConfigurator.Create(Self, TListView(aListView));
752782end ;
753783
754784function TLoggerProBuilder.WriteToWindowsEventLog : IWindowsEventLogAppenderConfigurator;
755785begin
786+ SetPendingConfigurator(' WriteToWindowsEventLog' );
756787 Result := TWindowsEventLogAppenderConfigurator.Create(Self);
757788end ;
758789
759790function TLoggerProBuilder.WriteToWindowsEventLogForService (aService: TObject): IWindowsEventLogAppenderConfigurator;
760791begin
761792 if not (aService is TService) then
762793 raise ELoggerPro.Create(' WriteToWindowsEventLogForService requires a TService instance' );
794+ SetPendingConfigurator(' WriteToWindowsEventLogForService' );
763795 Result := TWindowsEventLogAppenderConfigurator.Create(Self, TService(aService));
764796end ;
765797
766798{ $ENDIF}
767799
768800function TLoggerProBuilder.WriteToFireDAC : IFireDACAppenderConfigurator;
769801begin
802+ SetPendingConfigurator(' WriteToFireDAC' );
770803 Result := TFireDACAppenderConfigurator.Create(Self);
771804end ;
772805
773806function TLoggerProBuilder.WriteToFilteredAppender (aAppender: ILogAppender): IFilteredAppenderConfigurator;
774807begin
808+ SetPendingConfigurator(' WriteToFilteredAppender' );
775809 Result := TFilteredAppenderConfigurator.Create(Self, aAppender);
776810end ;
777811
@@ -817,6 +851,10 @@ function TLoggerProBuilder.Build: ILogWriter;
817851 lLogWriter: TCustomLogWriter;
818852 I: Integer;
819853begin
854+ if not FPendingConfiguratorName.IsEmpty then
855+ raise ELoggerPro.Create(' Appender configurator "' + FPendingConfiguratorName +
856+ ' " was not finalized. Call .Done before calling .Build' );
857+
820858 if FAppenders.Count = 0 then
821859 raise ELoggerPro.Create(' No appenders configured. Add at least one appender before calling Build.' );
822860
@@ -1284,6 +1322,12 @@ function TCallbackAppenderConfigurator.WithLogLevel(aLogLevel: TLogType): ICallb
12841322 Result := Self;
12851323end ;
12861324
1325+ constructor TCallbackAppenderConfigurator.Create(aBuilder: TLoggerProBuilder);
1326+ begin
1327+ inherited ;
1328+ FSynchronizeToMainThread := False;
1329+ end ;
1330+
12871331function TCallbackAppenderConfigurator.Done : ILoggerProBuilder;
12881332var
12891333 lAppender: ILogAppender;
0 commit comments