AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Optimales Logging: Assert-basiert oder NULL-Logger: Ja oder besser nicht ?
Thema durchsuchen
Ansicht
Themen-Optionen

Optimales Logging: Assert-basiert oder NULL-Logger: Ja oder besser nicht ?

Ein Thema von Rollo62 · begonnen am 17. Dez 2019 · letzter Beitrag vom 19. Dez 2019
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.168 Beiträge
 
Delphi 12 Athens
 
#1

AW: Optimales Logging: Assert-basiert oder NULL-Logger: Ja oder besser nicht ?

  Alt 17. Dez 2019, 16:51
Ja die LogFunktionen liegen in einer anderen Unit.
Da kann ich globale Features gruppieren, etc., muss aber immer mit .inc Dateien hantieren.
Schöner fände ich das im Kopf einer Unit.

Was dann aber trotzdem passiert, ist das Aufrufen evtl. leerer Funtionen,
den Funktion-Call würde ich natürlich auch gerne im RELEASE wegbekommen.

Man könnte evtl. auch was mit Mocks machen, aber ich meine die sind dafür auch nicht optimal.

Es geht z.B. um Folgende Situation:
Ich muss ein Problem debuggen, und baue dafür an zig Stellen in einer/mehreren Units Logs ein.
Wenn das läuft müsste ich
1. entweder alle Logs wieder rausbauen
2. oder die Logs einfach "ausschalten" (und möglichst NUR diese)

Ich möchte halt 2tes Erreichen, auch weil ich die Logs für spätere Tests noch drinbehalten möchte.

Mit Asserts wäre das z.B. möglich, denn man kann im Kopf einer Unit Assertions ein/ausschalten
$ASSERTIONS ON/OFF und damit wäre der Aufruf der Asserts weg (keine leere Funktion wird benötigt)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.680 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Optimales Logging: Assert-basiert oder NULL-Logger: Ja oder besser nicht ?

  Alt 17. Dez 2019, 17:05
Ich nehme an, Du meinst bei der Assertion-basierten Lösung sowas wie:

https://stackoverflow.com/a/16459891/49925

Assert(False, 'Dies ist eine Logmeldung');
Ich habe das mal ausprobiert und bin da nicht so der Fan:

Vorteil Assertion:
* Man kann das Logging recht einfach komplett ausschalten
* Man kommt einfach an die Zeilennummer der Assertion, in der die Log-Message geschrieben wird.

Nachteil Assertion:
* Wer es nicht kennt, den verwirrt diese Verwendung von Assert.
* Assertions sind ziemlich CPU-Intensiv, d.h bei eingeschaltetem Logging ändert sich das Zeitverhalten stark.
* Man kann Assertions nicht mehr anderweitig verwenden.

Persönlich bevorzuge ich die NULL-Logger-Lösung. Es ist einfach sauberer.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#3

AW: Optimales Logging: Assert-basiert oder NULL-Logger: Ja oder besser nicht ?

  Alt 17. Dez 2019, 17:36
Was dann aber trotzdem passiert, ist das Aufrufen evtl. leerer Funtionen,
den Funktion-Call würde ich natürlich auch gerne im RELEASE wegbekommen.
Ich glaube, das hatten wir schon mal irgendwo an anderer Stelle (eventuell auch bei DP-EN oder SO). Wenn du die Methoden inline deklarierst, sollte gar kein Call mehr gemacht werden. In diesem Beispiel erzeugen die T.Init und T.Log Aufrufe keinen Code, wenn in uLogging nicht Log definiert ist.

Delphi-Quellcode:
procedure Main;
var
  T: TLog;
begin
  T.Init('TLogConsole');
  T.Log('Hallo Welt');
  Writeln('Wie geht''s?');
  Readln;
end;
Delphi-Quellcode:
unit uLogging;

interface

{.$DEFINE Log}

type
  ILog = interface
  ['{76BA1F8A-D171-4817-BB3D-337295B03CE0}']
    procedure Log(AText: string);
  end;

  TLog = record
  private
    {$IFDEF Log}
    FLog: ILog;
    {$ENDIF}
  public
    procedure Init(const AName: string); inline;
    procedure Log(AText: string); inline;
  end;

implementation

type
  TLogConsole = class(TInterfacedObject, ILog)
  public
    procedure Log(AText: string);
  end;

procedure TLogConsole.Log(AText: string);
begin
  Writeln(AText);
end;

procedure TLog.Init(const AName: string);
begin
  {$IFDEF Log}
  // der Einfachheit halber
  FLog := TLogConsole.Create;
  {$ENDIF}
end;

procedure TLog.Log(AText: string);
begin
  {$IFDEF Log}
  if FLog <> nil then begin
    FLog.Log(AText);
  end;
  {$ENDIF}
end;

end.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz