Zitat von
Astat:
Zitat von
RedShakal:
Das Problem ist doch noch nicht so gelöst wie ich dachte.
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.';
2. Das Problem mit dem mehrfachen Aufruf:
procedure TServer.IdTCPServer1Execute(AThread: TIdContext);
Ist ein Serverthread, dieser wird auch mehrfach aufgerufen werden können.
Dh. Die Log-Schreiberei und Globalen Variablen müssen Threadsave sein, sonst knallts sowiso irgendwann.
Tip: Das Logging in eine Threadsave Funktion auslagern, und mit CriticalSections synchronisieren.
Delphi-Quellcode:
var
_SyncLog: TRTLCriticalSection;
procedure LogWrite(const ALogfile, AMessage: string);
var
f: TextFile;
begin
EnterCriticalSection(_SyncLog);
try
AssignFile(f, ALogfile);
try
{$I-}
if FileExists(ALogfile) then Append(f) else Rewrite(f);
if IOResult <> 0 then Reset(f);
{$I+}
Writeln(f, AMessage);
finally
CloseFile(f);
end;
finally
LeaveCriticalSection(_SyncLog);
end;
end;
initialization
InitializeCriticalSection(_SyncLog);
finalization
DeleteCriticalSection(_SyncLog);
end.
lg. Astat
Ehrlich gesagt ist mir der Code etwas zu kompliziert. Schon mein Lehrer hat damals immer gesagt kopiere nie was du nicht verstehst
__________________________________________________ __________
Zitat von
alzaimar:
Zitat von
Astat:
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.';
Meinst Du nicht, man schießt mit Kanonen auf Spatzen und handelt sich u.U. unangenehme Seiteneffekte ein?
Eine einfache Funktion, die einen Dateinamen für Logdateien erstellt, ist doch ausreichend:
Delphi-Quellcode:
Function GetLogFilename() : String;
Var
y,m,d : Word;
Begin
DecodeDate(Now,y,m,d);
Result := Format('log\%.2d-%.2d-%.2d.TXT',[y,m,d]);
End;
Das klappt so leider auch nicht so ganz. Der IO Fehler besteht trozdem.
Es scheint so als würde er die Datei nicht richtig schließen, weil ich sie solang der Server läuft auch nicht im Windows öffnen kann.
Deshalb habe ich jetzt mal Testweise unter jedes WriteLn ein Closefile geschrieben. Leider ohne erfolg.