AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Log-Datei realisieren

Ein Thema von MatthiasR · begonnen am 8. Nov 2007 · letzter Beitrag vom 8. Apr 2016
Antwort Antwort
Seite 2 von 5     12 34     Letzte » 
FarAndBeyond
(Gast)

n/a Beiträge
 
#1

AW: Log-Datei realisieren

  Alt 8. Apr 2016, 06:05
@ shmia:
Besten Dank, die Klasse kannte ich noch nicht...

Hab' bis jetzt immer 'ne TStringlist genommen, da das sehr viel einfacher ist als die Einzelbefehle...
Brauche in Kürze eh mal öfter'n MemoryStream, da bietet sich das komplette Stream-Thema ja eigentlich an.
  Mit Zitat antworten Zitat
Reinhard Kern

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

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 00:41
Zitat von Infect:
Hallo allerseits,

ich möchte gerne eine Log-Datei realisieren, in die mehrere Programme (bzw. mehrere Instanzen desselben Programms) ihre Einträge machen. Wie realisiere ich so etwas am besten, ohne dass die Programme sich beim Hineinschreiben in die Datei in die Quere kommen?

Bisher hatte ich folgende Routine vorgesehen für das Anhängen von Log-Einträgen:
Delphi-Quellcode:
AssignFile(f, 'C:\Test.log');
try
  Append(f);
  Writeln(f, 'Ein Log-Eintrag');
finally
  CloseFile(f);
end;
Hier kann es aber theoretisch passieren, dass zwei Programme gleichzeitig die Datei öffnen wollen und dann kracht es bei dem Programm, das einen Tick später drangekommen ist.
Hallo,

warum versuchst du nicht das Eingachste: die Logdatei exklusiv zu öffen. Das kann immer nur ein Programm, ein anderes muss es später nochmal versuchen.

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 01:36
ohne Stream gehts genauso ... einfach versuchen die Datei exklusiv zu öffnen
Delphi-Quellcode:
AssignFile(F, LogFile);
FileMode := fmOpenReadWrite or fmShareExclusive;
{$I-}
Append(F);
WriteLn(F, S);
If IOResult <> 0 Then <<ging nich>>;
CloseFile(F);
{$I+}
tja und wenn's nich geht, dann halt 'ne Weile versuchen
Delphi-Quellcode:
AssignFile(F, LogFile);
FileMode := fmOpenReadWrite or fmShareExclusive;
Try
  Repeat
    {$I-} Append(F); {$I+}
    Sleep(10);
  Until IOResult = 0;
  WriteLn(F, S);
Finally
  CloseFile(F);
End;
soooo, und jetzt noch 'ne Zeitbegrenzung und so'n Zeugs rein ... fertsch (denk'sch ma)
Delphi-Quellcode:
Function AddLog(Const LogFile, S: String; TimeOut{ms}: LongWord = 3000): Boolean;
  Var F: TextFile;
    C: LongWord;
    M: Byte;

  Begin
    Result := False;
    M := FileMode;
    FileMode := fmOpenReadWrite or fmShareExclusive;
    AssignFile(F, LogFile);
    Try
      C := GetTickCount;
      While True do Begin
        {$I-} Append(F); {$I+}
        If IOResult = 0 Then Break;
        If GetTickCount - C > TimeOut Then Exit;
        //Application.ProcessMessages;
        Sleep(10);
      End;
      WriteLn(F, S);
      Result := True;
    Finally
      CloseFile(F);
      FileMode := M;
    End;
  End;

If not AddLog('a.log', 'irgendwas muß rein') Then Error...
OK, als WinAPI sieht's och nett aus ^^
Delphi-Quellcode:
Function AddLog(LogFile, S: String; TimeOut{ms}: LongWord = 3000): Boolean;
  Var H: THandle;
    C: LongWord;

  Begin
    Result := False;
    S := S + #13#10;
    C := GetTickCount;
    Repeat
      H := CreateFile(PChar(LogFile), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, 0, 0);
      If H <> INVALID_HANDLE_VALUE Then Begin
        SetFilePointer(H, 0, nil, FILE_END);
        WriteFile(H, S[1], Length(S), C, nil);
        CloseHandle(H);
        Result := True;
        Exit;
      End;
      //Application.ProcessMessages;
      Sleep(10);
    Until GetTickCount - C > TimeOut;
  End;
[add]
ich sollt vielleicht ma weniger nebenbai chatten ... da is doch plötlich 'nen neuer Beitrag drin und sogar mit RedBox ^^

[edit]
immer diese Rechtschreibfehler
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#4

AW: Re: Log-Datei realisieren

  Alt 7. Apr 2016, 19:30

OK, als WinAPI sieht's och nett aus ^^
Delphi-Quellcode:
Function AddLog(LogFile, S: String; TimeOut{ms}: LongWord = 3000): Boolean;
  Var H: THandle;
    C: LongWord;

  Begin
    Result := False;
    S := S + #13#10;
    C := GetTickCount;
    Repeat
      H := CreateFile(PChar(LogFile), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, 0, 0);
      If H <> INVALID_HANDLE_VALUE Then Begin
        SetFilePointer(H, 0, nil, FILE_END);
        WriteFile(H, S[1], Length(S), C, nil);
        CloseHandle(H);
        Result := True;
        Exit;
      End;
      //Application.ProcessMessages;
      Sleep(10);
    Until GetTickCount - C > TimeOut;
  End;

Hey ich hab mal ne Frage.
Auf die Art und Weise habe ich noch nie in eine Datei geschrieben, daher die Frage.

Meine Logdatei hat vor jedem Zeichen einen NUL Charakter.
Ist das normal? Bzw. geht das mit der Funktion auch anders?
Sieht sehr bescheiden aus. Man kann quasi nix lesen.
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Re: Log-Datei realisieren

  Alt 8. Apr 2016, 08:34
Meine Logdatei hat vor jedem Zeichen einen NUL Charakter.
Ist das normal? Bzw. geht das mit der Funktion auch anders?
Sieht sehr bescheiden aus. Man kann quasi nix lesen.
hört sich nach einem Unicodeproblem an. Aber warum WinAPI? Gibt es dafür einen besitmmten Grund? Schau mal ob deine Delphiversion TStreamWriter unterstützt und wenn ja dann verwende das.. Wenn ich das richtig sehe wurde das mit Delphi 2010 eingeführt...

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Log-Datei realisieren

  Alt 8. Apr 2016, 09:15
Die #0 stört nicht, aber dass der halbe Text fehlt ist vielleicht etwas schlimmer. (seit Delphi 2009)

Jupp, die bösen Jugendsünden bestrafen Einen immer wieder.
Einfach aus String ein AnsiString machen und aus #13#10 ein sLineBreak.

Und da wir "nette" Programmierer sind, wird auch noch aus GENERIC_WRITE, 0 ein GENERIC_WRITE, FILE_SHARE_READ.



Die WinAPI hatte hier den Vorteil, daß die Fehlerbehandlung etwas "sanfter" reagiert, also vorallem ohne Exceptions.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Apr 2016 um 09:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#7

AW: Log-Datei realisieren

  Alt 8. Apr 2016, 21:47
Nun, es musste natürlich wieder schnell gehen, und das hier hatte ich mit als erstes gefunden

Und da der Code von himitsu war, hab ich ihn genommen.


Aktuell nutze ich den Code hier von Luckie:
Delphi-Quellcode:
function WriteLog(LogFile, LogString: String): Integer;
var
  f: TextFile;
begin
{$IOCHECKS OFF}
  AssignFile(f, LogFile);
  if FileExists(LogFile) then
    Append(f)
  else
    Rewrite(f);
  Writeln(f, LogString);
  CloseFile(f);
  Result := GetLastError();
{$IOCHECKS ON}
end;
Welcher ist denn nun besser?
Wie shmia oben schreibt sollte man solchen Code heute nicht mehr nutzen, da es bessere Wege gibt.

Zur Erklärung:
Ich schreibe ein kleines Tool um Prime95 fernzusteuern und lasse alle 30 Sekunden die Kerntemperaturen speichern. Dafür brauche ich die Logfunktion
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180

Geändert von MuTzE.Y85 ( 8. Apr 2016 um 21:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Andreas H.
Andreas H.

Registriert seit: 3. Mär 2006
Ort: Schopfloch
163 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 05:29
Hallo,

nur so aus der Hüfte geschossen...

wenn das exklusive Öffnen nix is, dann vielleicht nen kleinen Server aufsetzen, in dem per POST oder so die Logmeldungen gesendet werden. Ist natürlich aufwendiger, als "nur" ne Prozedur zu schreiben. Dann wäre auch das Dateiformat und der Speicherort gekapselt.

Vielleicht läuft ja schon ein Apache oÄ. And ein paar Zeilen PHP...

Aber wenn denn schon von verschiedenen Programmen auf verschiedenen Rechnern Logmeldungen zentral gesichert werden sollen...

Gruß Andreas
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 05:40
Hallo
ich hätte auch noch eine grundsätzliche idee:
Parallele schreibzugriffe schreiben in temporäre weitere neue log's, welche beim nächsten schreibzugang wieder zusammengeführt werden. Die weiteren templogs', welche es nur gab, weil das Hauptlog gesperrt war, leben nur so lange, wie der nächste schreibzugriff erfolgt. 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 ?
Peter Schaible
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#10

Re: Log-Datei realisieren

  Alt 9. Nov 2007, 05:44
Noch etwas zum EventLog des Betriebssystem. Das ist eigentlich fürs betriebssystem nahe Applikationen. Wenn da jeder seinen Müll reinwirft, dann hat es ein Admi wirklich schwer...
Tip das Eventlog für eigene Programme NICHT verwenden! Besser eine Logdatei abgelegt unter "Einstellungen und Dokumente" ...
Peter Schaible
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte » 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:01 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