AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Log-Datei realisieren

Ein Thema von MatthiasR · begonnen am 8. Nov 2007 · letzter Beitrag vom 8. Apr 2016
Antwort Antwort
Seite 3 von 5     123 45      
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.873 Beiträge
 
Delphi 11 Alexandria
 
#1

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 06:38
Der trend geht aber zum Eventlog, welcher i9n Vista deshalb stark erweitert wurde.
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 06:58
Hallo Leute,

ein logfile soll ja für einen bestimmten Zeitraum ein lückenloses Protokoll der Aktionen oder Ereignisse im Leben eines Programms liefern. Wenn das Protokoll wichtig ist, dann muss es lokal geschrieben werden, da bei einer instabilen Netzwerkverbindung ein Entscheidungsproblem entsteht: Muss der Client jetzt seine Arbeit einstellen. In einem Client-Server-Scenario lässt man den Server protokollieren. Schreiben die Clients eigene lokale Protokolle, dann ist eine übergreifende Auswertung durch Zusammenführen der logfiles möglich, auch wenn ich mir die Notwendigkeit gerade nicht vorstellen kann.

Grüße vom marabu
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#3

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 10:28
Erstmal Danke für die vielen Vorschläge! Ich habe mir nun anhand von himitsus Beispielen noch etwas selbst zusammengebaut. Bitte schaut euch das mal an, was es daran auszusetzen gibt. Zuvor aber noch ein paar für mich offene Fragen:
  • Was bewirkt die Compiler-Direktive {$I}? Ist die nur dazu da, dass bei Append keine Exception ausgelöst wird, wenn die Datei schon offen ist? Könnte man die Direktive also auch weglassen und stattdessen mit Exceptions arbeiten (wie ich in meinem Beispiel)?
  • Was bewirkt die Zeile "FileMode := fmOpenReadWrite or fmShareExclusive;" genau? Ich habe mir dazu mal bissle die Hilfe durchgelesen, aber so richtig schlau wurde ich nicht daraus.
  • Müsste das finale "CloseFile" nicht auch wieder mit der Direktive {$I} geklammert werden, zumindest bei mir kommt ein "E/A-Fehler 103", wenn ich "CloseFile" aufrufe und die Datei war zuvor nicht mit "Append" geöffnet worden. Oder man führt einfach ein weiteres Flag ein, wie in meiner Lösung, ob das Öffnen zuvor geklappt hat.

Hier mein Entwurf:
Delphi-Quellcode:
procedure TForm1.btnWriteLnClick(Sender: TObject);
var
  s: String;
  FFile: TextFile;
  bSuccess: Boolean;
  iBeginTime: Integer;
  iWaitTime: Integer;
begin
  bSuccess := False;
  iBeginTime := GetTickCount;
  iWaitTime := 0;
  AssignFile(FFile, 'C:\Test.log');
  try
    while (iWaitTime < 10000) do
    begin
      try
        Append(FFile);
        if (ParamCount > 0) then
          s := 'Programm ' + ParamStr(1)
        else
          s := 'Programm 1';
        WriteLn(FFile, s);
        bSuccess := True;
        Break;
      except
        Sleep(10);
        iWaitTime := getTickCount - iBeginTime;
      end;
    end;

    if (not bSuccess) then
      ShowMessage('Schreiben fehlgeschlagen.')
    else
      ShowMessage('Schreiben erfolgreich.')
  finally
    if bSuccess then
      CloseFile(FFile);
  end;
end;
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 13:59
Zitat von Infect:
Ich habe mir nun anhand von himitsus Beispielen noch etwas selbst zusammengebaut.
Ich verstehe nicht, weshalb du eine Bastel-Lösung gegenüber einer Profilösung bevorzugst ?
Delphi-Quellcode:
var
  logstream: TExclusiveFileStream;
  s : string;
begin
  logstream := TExclusiveFileStream.Create('C:\Test.log', 10000);
  try
    logstream.SeektoEnd; // Ans Dateiende, wir wollen anhängen
    if (ParamCount > 0) then
      s := 'Programm ' + ParamStr(1)
    else
      s := 'Programm 1';
    s := s + #13#10; // Zeilenvorschub
    logstream.WriteBuffer(s[1], length(s)); // Daten schreiben
  finally
    logstream.Free;
  end;
end;
Andreas
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#5

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 14:11
Zitat von Infect:
Erstmal Danke für die vielen Vorschläge! Ich habe mir nun anhand von himitsus Beispielen noch etwas selbst zusammengebaut. Bitte schaut euch das mal an, was es daran auszusetzen gibt. Zuvor aber noch ein paar für mich offene Fragen:
  • Was bewirkt die Zeile "FileMode := fmOpenReadWrite or fmShareExclusive;" genau? Ich habe mir dazu mal bissle die Hilfe durchgelesen, aber so richtig schlau wurde ich nicht daraus.
Hallo,

dadurch, dass du das einfach weglässt, ist dein Entwurf reiner Unsinn. Du hast weder meinen noch den Beitrag himitsus auch nur annähernd verstanden. Vielleicht solltest du mal ganz einfach anfangen "watt is eine Datei"...

Gruss Reinhard
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#6

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 14:22
Zitat von marabu:
Hallo Leute,

ein logfile soll ja für einen bestimmten Zeitraum ein lückenloses Protokoll der Aktionen oder Ereignisse im Leben eines Programms liefern. Wenn das Protokoll wichtig ist, dann muss es lokal geschrieben werden, da bei einer instabilen Netzwerkverbindung ein Entscheidungsproblem entsteht: Muss der Client jetzt seine Arbeit einstellen. In einem Client-Server-Scenario lässt man den Server protokollieren. Schreiben die Clients eigene lokale Protokolle, dann ist eine übergreifende Auswertung durch Zusammenführen der logfiles möglich, auch wenn ich mir die Notwendigkeit gerade nicht vorstellen kann.

Grüße vom marabu
Hallo marabu,

der Einwand ist durchaus berechtigt. Ich würde das Logfile sowohl lokal als auch auf dem Server schreiben (zumindest dort natürlich ergänzt um die Client Identifikation), weil das immer noch die einfachste Variante ist. Findet man im Serverlog keine Einträge mehr, kann man im Clientlog nachschauen.

Für die aktuelle Diskussion ist das ziemlich irrelevant, solang noch nicht einmal das Schreiben überhaupt funktioniert.

Gruss Reinhard
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#7

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 14:42
Zitat von shmia:
Zitat von Infect:
Ich habe mir nun anhand von himitsus Beispielen noch etwas selbst zusammengebaut.
Ich verstehe nicht, weshalb du eine Bastel-Lösung gegenüber einer Profilösung bevorzugst ?
Weil ich diese Profilösung, bevor ich sie in eine Anwendung einbaue, gerne vorher verstehen würde. Und das tue ich bei deiner Profilösung leider nicht, weil ich wahrscheinlich, wie Herr Kern es vermutet, schlichtweg zu blöd zum Programmieren bin.
Zitat von Herr Kern:
Hallo,

dadurch, dass du das einfach weglässt, ist dein Entwurf reiner Unsinn. Du hast weder meinen noch den Beitrag himitsus auch nur annähernd verstanden. Vielleicht solltest du mal ganz einfach anfangen "watt is eine Datei"...

Gruss Reinhard
Wenn Sie die Güte hätten, mich an Ihrem Wissen teilhaben zu lassen, und mir mitteilen könnten, warum mein Entwurf reiner Unsinn ist, dann könnte ich vielleicht etwas weniger blöd sterben und es (vielleicht, aber nur vielleicht) in 2 bis 65 Jahren zu einem halbwegs fähigen Software-Entwickler schaffen.

EDIT: Um wieder bisschen runterzukommen: watt is eine Datei???
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#8

Re: Log-Datei realisieren

  Alt 10. Nov 2007, 01:25
Zitat von Infect:
...
Wenn Sie die Güte hätten, mich an Ihrem Wissen teilhaben zu lassen, und mir mitteilen könnten, warum mein Entwurf reiner Unsinn ist, dann könnte ich vielleicht etwas weniger blöd sterben und es (vielleicht, aber nur vielleicht) in 2 bis 65 Jahren zu einem halbwegs fähigen Software-Entwickler schaffen.

EDIT: Um wieder bisschen runterzukommen: watt is eine Datei???
EXCLUSIVE ist das entscheidende: ich habe es vorgeschlagen, hamamitsu hat damit eine ganze Beispielprozedur geschrieben und shmia hat eine Alternative mit TExclusiveFileStream vorgeschlagen, die intern das gleiche tut. Vielleicht sind wir ja blöd, aber immerhin sind wir schon zu dritt.

Da du nix verstanden hast, lässt du das entscheidende Statement mit fmShareExclusive einfach weg. So was nenne ich beratungsresistent.

Wenn du dich mal mit Dateien beschäftigen würdest, dann würdest du auch auf den Begriff "exklusiver Zugriff" stossen. Meine Meinung zum Thema: solange du diesen Punkt nicht verstanden hast, kannst du dein Problem nicht lösen - stattdessen auf Mutexe u.a. auszuweichen, ist Blödsinn, weil das das Problem nur anders einkleidet und dazu noch komplizierter ist als Datei-Zugriffe.

Natürlich hast du als Jungprogrammierer das Recht, alles anders zu sehen und alle Erkenntnisse der IT mit Verachtung zu strafen. Schon ein Konkurrent weniger.

Gruss Reinhard
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: Log-Datei realisieren

  Alt 10. Nov 2007, 02:41
Ooohh, wie ist das schöön. Meine 10 ct zum Thema : externes Logfile z.B. Windows ist Käse. Ich würds zumindest nicht damit machen. Eigenes Logfile ist besser. Dazu würde ich aber keine Datei verwenden, sondern Datenbank. Ob die auf einem Server liegt oder lokal, das ist wohl nicht so wichtig. Notfalls muss sie eben regelmäßig lokal gesichert werden. Das gilt natürlich auch für die Daten an sich. Die sind schließlich wichtiger, als ein gesichertes Logfile ohne Daten. Man könnte die zu protokollierenden Sachen auch in die vorhandene Datenbank schreiben und basta. Aber je nachdem, was da wie reingeschrieben wird kann es durchaus sein, dass das Logfile bzw. die Tabelle (viel) größer wird, als die vorhandenen Daten. In einem Programm protokolliere ich z.B. jede gedruckte Zeile. Das aber immer mitzusichern wäre völlig überdimensioniert. Für den Fall der Fälle sollte man das zwar schon mal sichern, aber doch nicht dauernd. Obwohl, ich schreibe hier über Datensicherung etc. und das ist wohl sowieso eher von untergeordneter Bedeutung.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#10

Re: Log-Datei realisieren

  Alt 10. Nov 2007, 02:47
das mit fmShareExclusive wurde ja schon angesprochen,
aber gern nochmals - dieses sorgt dafür daß NUR Einer zur selben Zeit die Datei öffnen kann und nicht Mehrere.


ups, ja stimmt ... ohne TimeOut wird die Schleife ja nicht verlassen, bevor die Datei nicht geöffnet wurde, also kein Problem,
aber mit TimeOut sollte man die mögliche Exception bei CloseFile natürlich auch abfangen,
also {$I-} CloseFile(F); {$I+}.

Und was das Arbeiten mit Exceptionen angeht, klar ist es möglich, aber hier gab's schonmal ein Streitgespräch darüber, ob man überhaupt absichtlich Exceptionen auslösen soll, um den Programmablauf zu steuern und da meinten die Meisten berechtigt nein.



Zitat von peschai:
Wer also das Hauptlog exclusiv öffnen kann, muss zuerst die anderen templogs auslesen und reinschreiben, dann diese templogs löschen und dann erst seine eigenen Sachen eintragen ...

was meint ihr ?
ja und dann muß man wieder die TempLogs gegen gleichzeitigen Zugriff absichern,
denn wenn ein anderer Prozess grad noch in ein TempLog reinschreibt, dann gibt es bestimmt Probleme wenn plötzlich gleichzeitig jemand anderes versucht diesen auszulesen (um ihn in den HauptLog einzutragen).

im Prinzip eine nette Lösung, aber da es sich hier nur um kurzzeitige Sperrungen des HauptLogs handelt (eie Zeile einzufügen dauert ja nicht lange), wäre der Aufwand wohl eher zu groß.
Sowas würde sich mehr für Dinge lohnen wo die Sperrung viel zu lange zum Warten dauert.

Alternativ könnte man auch im Programm sowas wie eine Warteliste anlegen, wo man die Logeinträge einfügt und welche dann bei nächster Gelegenheit in die Logdatei eingetragen werden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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 03:23 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