Ik maak nu gebruik van deze procedure om een logbestand weg te schrijven:
Delphi Code:
procedure TMyLog.Log(const Loglevel : byte; Msg : String);
var StreamMessage : string;
FStream : TFileStream;
LBuffer : TBytes;
LByteOrderMark: TBytes;
LOffset : Integer;
LEncoding, DestEncoding: TEncoding;
begin
LEncoding:= TEncoding.unicode;
if LogLevel <= FMaxLogLevel then
begin
StreamMessage := format('%s [%s] %s',[Datumlog,FPrintnr,Msg]) + #13#10;
DestEncoding := TEncoding.UTF8;
SetLength(LBuffer, length(StreamMessage) * sizeof(char));
if StreamMessage <> '' then Move(StreamMessage[1], lbuffer[0], Length(lbuffer));
LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding);
LBuffer := LEncoding.Convert(LEncoding, DestEncoding, LBuffer,
LOffset, Length(LBuffer) - LOffset);
if FileExists(FLogFile) then
begin
FStream := TFileStream.Create(FLogFile, fmOpenReadWrite or fmShareDenyNone);
FStream.Position := FStream.Size;
end
else
begin
FStream := TFileStream.Create(FLogFile, fmCreate or fmShareDenyNone);
LByteOrderMark := DestEncoding.GetPreamble;
// Write an encoding byte order mark and buffer to output file
FStream.Write(LByteOrderMark[0], Length(LByteOrderMark));
end;
try
FStream.Write(LBuffer[0], Length(LBuffer));
finally
FStream.Free;
end;
end;
end;
Werkt prima, maar erg vertragend. Telkens wordt er een bestand geopend, regel weggeschreven en weer afgesloten.
Ik wil dit graag gaan versnellen, want gebruikers hebben een hekel aan wachten. Kan ik dit ombouwen naar een tmemorystream en periodiek / aan het einde van de log deze opslaan? Of kan ik de TFilestream op een of andere manier openlaten en regels wegschrijven, zodat aan het einde van de log deze wordt afgesloten?
Bookmarks