![]() |
results loggen
Hat vielleicht jemand eine Logger unit mit der ich Resultate in eine Datei schreiben kann?
Falls nicht muss ich selbst was schreiben.
Delphi-Quellcode:
Das ist mir etwas zu einfach. (vielleicht mit mehr Möglichkeiten)
procedure Log(Text:string);
var F : TextFile; FileName : String; dt:string; begin FileName := ExtractFilePath(ParamStr(0)) + 'Log.txt'; AssignFile(F, FileName); if FileExists(FileName) then Append(F) else Rewrite(F); dt:=DateToStr(Date); dt:=dt+' / '+TimeToStr(Time); WriteLn(F, dt, ' : ', text); CloseFile(F); end; Vielleicht hat ja jemand etwas besseres (keine Komponente) und D2010 |
AW: results loggen
![]() ![]() Und dann findet man noch viele andere Komponenten, auf diversen Plattformen, wie z.B. ![]() |
AW: results loggen
Wenn CodeSite nicht nach Geschmack sein sollte, dann gäbe es unter Windows noch OutputDebugString,
die Texte kann man z.B. auch mit der IDE in der Ereignisanzeige sehen. Und nutzt man FMX gibt's noch d.log, welches cross platform fähig ist. Unter Windows nutzt die wohl OutputDebugString unter Android kann man die Meldungen mit Monitor.bat aus dem SDK anzeigen lassen. |
AW: results loggen
Zitat:
Zitat:
DUnitX ist nicht für D2010 geeignet. CodeSite Express 399 Dollar für ein Freeware Projekt? Log4Delphi = Komponente. Ok. Werde mich mal selber umsehen dachte jemand hatte etwas hier. Über Google kann ich selber suchen da muss sich hier niemand drum bemühen. |
AW: results loggen
schau dir mal Mormot an
![]() das sollte auch in D2010 laufen, da gibt es SynLog, den ganzen anderen Rest musst Du nicht nutzen... |
AW: results loggen
Zitat:
|
AW: results loggen
Wie wäre es total oldschool, so in etwa:
Delphi-Quellcode:
Ps: Nur hier im Editor "entwickelt" ohne zu testen. Aber was ich damit meine/mache sollte hoffentlich klar sein.
procedure LogResult(const Text: string; const LogFile: string);
var myFile : TextFile; begin AssignFile(myFile, FileName); if not FileExists(FileName) then ReWrite(myFile); Append(myFile); WriteLn(myFile, Text); CloseFile(myFile); end; //edit Ups, jetzt erst gesehen das Du da Code rangepappt hattest, ich hatte Browser über Nacht offen... |
AW: results loggen
@venice2: Definiere generell mal deine Anforderung "mehr Möglichkeiten" und was du dir darunter vorstellst. Generell macht ja dein Code und der von Codezwerg das was du willst, das Result in einer Datei loggen.
Ich vermute mal du willst zusätzlich noch so etwas mit loggen, wie z.B.:
Je nach dem empfiehlt es sich auch im CSV-Format zu loggen (z.B.: Datum/Zeit;Funktionsname;Variablen;Result), dann kannst du das Log später (falls gewünscht) schöner in Excel auswerten. |
AW: results loggen
Zitat:
Funktion aufgerufen und welches Ergebnis erzielt wurde. Vielleicht ist dann doch mein kleines Schnipsel ausreichend. Wollte keine Unruhe hier einbringen. Zitat:
Es sind Abhängigkeiten zu anderen Units nötig. Man kann nicht einfach nur SynLog.pas verwenden. Danke für den Tip. Eventuell reicht einfach schon OutputDebugString wie TurboMagic schon sagte. |
AW: results loggen
Ich glaube nicht, dass wegen deiner Frage hier Unruhe aufkommt. :wink:
Das Fehlerprotokoll ist ja üblicherweise nicht für den Anwender gedacht. Daher auch die Frage, welche Möglichkeiten DU haben möchtest. Ich trage in meine Protokolle üblicherweise bei Excpetions auch den Text der Exception mit ein. Bei kontrollierten Fehlern ist natürlich eigener Text drin. Ich arbeite da gerne mit strukturierten Fehlernummer und kurzen Klartexten, falls das doch mal telefonisch übermittelt werden muss. Über die Fehlernummer weiß ich dann, an welcher Stelle das Problem aufgetreten ist. Man kann natürlich Unit, Prozedur, Funktion, etc. ausgeben. Alles Geschmackssache, aber für den Anwender eher verwirrend (ist zumindest meine Erfahrung). Ein Zeitstempel ist natürlich selbstverständlich. Aber den hast du ja schon berücksichtigt. Wenn Anwender die Protokolle auswerten können sollen, muss das ausführlicher und für Anwender verständlich geschrieben sein. |
AW: results loggen
Ich werfe mal meine Logging Fassade
![]() |
AW: results loggen
Zitat:
Log4D, TestFramework, GUITestRunner, TextTestRunner, |
AW: results loggen
Zitat:
|
AW: results loggen
Zitat:
Werde es mal mit einem eigenen Example testen. Ist ja nur das eine enthalten. Danke. |
AW: results loggen
Danke für das Feedback, ich ergänze das Wiki um ein Beispiel ohne Abhängigkeiten. Das hier sollte gehen:
Delphi-Quellcode:
program HelloWorld;
uses djLogOverSimpleLogger, djLogAPI, djLoggerFactory; var Logger: ILogger; begin Logger := TdjLoggerFactory.GetLogger('demo'); Logger.Info('Hello World'); WriteLn('hit any key'); ReadLn; end. |
AW: results loggen
Zitat:
Mit Exeption und den anderen Kram so wie er in deinem aktuellen Example vorhanden ist. Wenn möglich ohne fremd Units (Abhängigkeiten) :) |
AW: results loggen
Zitat:
|
AW: results loggen
Zitat:
Wenn der sagt "dürcke irgendwas", dann muß man OK drücken (alles andere geht nicht) und wenn er sagt "drücke OK", dann kann man alles andere drücken (außer OK, was da nicht geht). Zitat:
|
AW: results loggen
TMSLogger ist kostenlos und bietet sehr vielfältige Möglichkeiten und ist CrossPlatform tauglich.
|
AW: results loggen
Kostenlos ?
Also das folgende "TMS Logging" ![]() kostet scheinbar. |
AW: results loggen
Ok, sorry. Ich dachte es wäre auf der folgenden Liste gewesen:
![]() War vielleicht auch mal so. Ich habe eh einige TMS-Komponenten, da diese viel Arbeitsaufwand ersparen und einen wirklich guten Support beeinhalten. |
AW: results loggen
Zitat:
Ich warte auf ein Example vom @mjustin ;) bis es zur Verfügung steht. |
AW: results loggen
Vielleicht eine naive Frage, aber was macht an der Stelle für dich eine Komponente aus. TMSLogging ist an der Stelle ja kein zwingender Bestandteil deiner App-UI.
Ich habe dazu nur die core-.pas-Files eingebunden und dann musst du dich nur entscheiden, ob du die FMX-TMSLogger oder VCL-TMSLogger-Variante als .pas-File einbindest. In meinen Formularen findest du dazu nichts. |
AW: results loggen
//OT
Zitat:
Schau doch mal letzte Aktualisierung an, 5 Jahre her, da du dich zurzeit damit beschäftigst, hilf ihm doch ein wenig und bastel eine Demo. *nur so ein Gedanke* Eine Vorlage dazu steht ja hier von ihm bereits zur Verfügung und ich trau es Dir zu. |
AW: results loggen
Zitat:
Mit Log4D ist es natürlich noch komfortabler, da es damit möglich ist in eine Datei zu loggen (und vieles mehr). |
AW: results loggen
Zitat:
Aber gut es ist zu mühsam das Thema fortzuführen da bin ich schneller wenn ich doch alles selber mache dann weis ich was ich hab. Zitat:
Wenn nicht dann ist es so. Zitat:
Habe noch keine Komponente gesehen die man nicht installiert das andere sind halt nur *.pas Dateien. |
AW: results loggen
Installieren muß man nur Komponenten, welche eine DesignTime-Funktion besitzen und welche man z.B. im FormDesigner auf die Form pappen möchte.
Alles andere braucht man nicht zu installieren. |
AW: results loggen
Zitat:
Am ende kann das jeder für sich auslegen. |
AW: results loggen
Nein, ist keine Auslegungssache:
Von TComponent abgeleitet ist eine Komponente, kann man installieren, muss man aber nicht. Wann das Installieren ein Muss ist, wurde weiter oben beschrieben. Ansonsten hilft bei 'ner nicht installierten Komponente im Quelltext an geeigneter Stelle ein
Delphi-Quellcode:
und wenns nicht mehr gebraucht wird ein
variabelnname := TKomponentenname.Create(nil);
Delphi-Quellcode:
Funktioniert letztlich nicht anders, als z. B. eine TStringList.
variabelnname.free;
Brauchst irgendwo ein Create und musst irgendwo ein Free einbauen. Aber ein Komponente = muss installiert werden, ist einfach nur falsch. Du kannst auch alle visuellen Komponenten deinstallieren und zur Laufzeit trotzdem nutzen. Musst sie an geeigneter Stelle per Create erstellen, die Position festlegen, ggfls. Inhalt zuweisen ... und an passender Stelle wieder freigeben. Nutze auf diese Weise etliche nichtinstallierte Komponenten, klappt seit vielen Jahren absolut problemlos. Du könntest also problemlos eine der beschriebenen Loggingkomponenten ohne Installation, nur durch einbinden der passenden Unit z. B. im FormCreate erstellen und im FormDestroy freigeben. Sind da bloß eine Zeile im Uses, eine Zeile für die passende Variabel, z. B. private-Abschnitt des Formulars, eine Zeile für's Create eine für's Free: Schwupps: Und schon kannst Du die nichtinstallierte Komponenten im ganzen Formular nutzen. Geht natürlich genauso einfach in 'nem Dienst, 'nem Konsolenprogramm ... |
AW: results loggen
Yepp, das würde ich so unterschreiben. Es gibt sogar viele Fremdhersteller-Komponenten, welche sich gar nicht so einfach installieren lassen bzw. nur mit genau einer Delphi-Version (meist die neuste) und für alle anderen Delphi-Versionen müsste man selber Hand anlegen. Ich binde auch viele Fremdhersteller-Komponenten nur per Hand ein, wie von Delphi.Narium beschrieben. Dann kann man auch ganz einfach zwischen unterschiedlichen Versionen dieser "Komponenten" wechseln. Wichtig ist dann nur, dass einem klar sein muss, ob man manuell etwas mit "deployen" muss, damit die "Komponente" läuft. Aber ist off-topic, ich wollte nur die Abneigung des Thread-Erstellers gegen Komponenten verstehen.
|
AW: results loggen
Nun gut wie auch immer.
Wer es testen will.
Delphi-Quellcode:
Aufruf Beispiel was von der DLL und oder Exe je nachdem wo man die DLL verwendet zurückgegeben wird.
unit Dynamic_Trace;
interface uses Windows, Messages; const dllfile = 'Tracer.dll'; var TRACE_Handle: Thandle = 0; Trace_Loaded: Bool = false; Trace: function(Msg: PWideChar): LongInt; stdcall; function Load_TRACEDLL(const dllfilename: string): BOOL; function GetTraceWinHandle: BOOL; procedure Unload_TRACEDLL; implementation function Load_TRACEDLL(const dllfilename: string): BOOL; var oldmode: integer; begin if TRACE_Handle <> 0 then Result := true else begin oldmode := SetErrorMode($8001); TRACE_Handle := LoadLibrary(PWideChar(dllfilename)); SetErrorMode(oldmode); if TRACE_Handle <> 0 then begin @Trace := GetProcAddress(TRACE_Handle, PAnsiChar('Trace')); if (@Trace = nil) then begin FreeLibrary(TRACE_Handle); TRACE_Handle := 0; end; end; Result := (TRACE_Handle <> 0); end; end; function GetTraceWinHandle: BOOL; var HWND: DWord; begin HWND := FindWindow('TRACER', 'TRACER'); Result := HWND <> 0; end; procedure Unload_TRACEDLL; var HWND: DWord; begin if TRACE_Handle <> 0 then begin HWND := FindWindow('TRACER', 'TRACER'); if HWND <> 0 then begin TRACE_Handle := SendMessage(HWND, WM_DESTROY, 0, 0); Trace_Loaded := false; end else begin TRACE_Handle := 0; Trace_Loaded := false; end; end; end; end.
Delphi-Quellcode:
Rechtsklick auf das Window öffnet ein PopupMenu wo man angeben kann ob man die Debugausgabe speichern will oder nicht.
if Trace_Loaded then
begin if GetTraceWinHandle then // prüfen falls das Window beendet wurde. begin Trace(PWideChar('BASSVIS_Init - Alias(SONIQUEVIS_Init) ' + ' Container Handle = ' + IntToStr(VisContainerHandle) + ' Result = ' + IIF(Result, 'TRUE', 'FALSE'))); Trace('------------------------- '); end; end; Im Archiv ist eine Debug.txt Datei enthalten kann man sich anschauen oder auch nicht, wie die Resultate ausgeben werden. Wenn man das Fenster nicht mehr sehen möchte einfach die DLL umbenennen. (Tracer.dll zu Tracer.dl) dann muss man nicht den Quelltext ändern. Wenn diese nicht gefunden wird Arbeitet sie logischerweise auch nicht. Deshalb Dynamisch geladen. Die unit Dynamic_Trace; muss in jedem Projekt eingebunden werden. |
AW: results loggen
Beim anschauen Deines Quelltext ist mir aufgefallen das
Delphi-Quellcode:
nirgends auf
Trace_Loaded
Delphi-Quellcode:
gesetzt wird, somit ist Dein Beispiel Code nicht ausführbar.
True
|
AW: results loggen
Zitat:
Das!
Delphi-Quellcode:
Result := (TRACE_Handle <> 0);
ist nicht True? Sollte mich wundern. Es sei denn das Handle wird nicht gefunden. Sollte mich aber ebenfalls wundern. Schaue bitte nochmal etwas genauer hin. |
AW: results loggen
Delphi-Quellcode:
wird immer scheitern da
if Trace_Loaded then
Delphi-Quellcode:
immer
Trace_Loaded
Delphi-Quellcode:
ist.
False
Das meinte ich damit und ich glaube Dir das es das macht was Du möchtest ohne es selbst auszuprobieren. |
AW: results loggen
Zitat:
Bitte sehr! Es kann doch nicht so schwer zu erkennen sein das diese Abfrage "True" ergibt wenn das Handle gefunden wurde. bzw. <> 0
Delphi-Quellcode:
Result := (TRACE_Handle <> 0);
|
AW: results loggen
Ja ne, iss klar. Wir reden aneinander vorbei, ich wollte Dich lediglich auf das offensichtliche Aufmerksam machen aber bin gescheitert und belasse es dabei.
Du redest von
Delphi-Quellcode:
und ich von
function Load_TRACEDLL(const dllfilename: string): BOOL;
Delphi-Quellcode:
.
Trace_Loaded
Wenn diese Methode das
Delphi-Quellcode:
setzen würde wäre es nie zu dieser Diskussion gekommen.
Trace_Loaded
Verzeihung und Danke für alles. |
AW: results loggen
Zitat:
Nun ja eigentlich sollte das klar und ersichtlich sein aber gut ich kann es gerne nochmal ausführlicher machen. Was ist die Rückgabe von Load_TRACEDLL ? Richtig.. BOOL. Also ist es doch logisch das ich damit mein Trace_Loaded verknüpfe oder?
Delphi-Quellcode:
Trace_Loaded := Load_TRACEDLL(ExtractFilePath(paramstr(0)) + dllfile);
Deshalb sagte ich es ist True.. abhängig davon ob die Funktion ein True zurück gibt.
Delphi-Quellcode:
function BASSVIS_Init(Kind: TBASSVIS_KIND_T; MainHandle: HWND; UseDebug: BOOL = false): BOOL; stdcall;
var HWND: DWord; begin Result := False; if UseDebug then begin if not Trace_Loaded then begin Trace_Loaded := Load_TRACEDLL(ExtractFilePath(paramstr(0)) + dllfile); if Trace_Loaded then begin Trace(''); repeat HWND := FindWindow('TRACER', 'TRACER'); // warten bis das Fenster erstellt wurde WinprocessMessages; until HWND <> 0; end; end; end else if Trace_Loaded then Unload_TRACEDLL; // .... end; |
AW: results loggen
ganz einfaches sample.
Debug.txt. Zitat:
Ansonsten wird es nur im Window ausgegeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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