Ynt: Log Dosyası Kayıt

Başlatan ByTEK, 14 Ocak 2016, 10:52:55

ByTEK

Merhaba arkadaşlar,

Delphi XE 10 ile firewall tarafından gönderilen UDP 514 portundan gelen logları analiz ederek kategorilere ayırıyorum. daha sonra her log geldiğinde ilgili konuma .txt olarak yazıyorum. yazma işini aşağıdaki kod kısmında çözdüm. program gayet başarılı çalışsada yoğun gelen datalar nedeni ile ve sürekli txt dosyasına yazmam programı kastırıyor. sanırım aşağıdaki yöntemim fazla işlem gücü gerektiriyor. Bu yolu seçme nedenim direkt txt dosyasına yeni satır olarak datayı ekleyememden kaynaklı.

var
bos : tstringlist;

begin

case Log_turu of

 0 : begin  // İnternet Erişim Logları
      if interneterisim_kayit then
        begin
          bos.LoadFromFile(log_yolu+'\ErisimLog_'+tarih+'.txt');
          bos.Add(Log);
          bos.SaveToFile(log_yolu+'\ErisimLog_'+tarih+'.txt');
        end;
     end;
 1 : Begin  // Dhcp Logları
      if dhcp_kayit then
        begin
          bos.LoadFromFile(log_yolu+'\DhcpLog_'+tarih+'.txt');
          bos.Add(Log);
          bos.SaveToFile(log_yolu+'\DhcpLog_'+tarih+'.txt');
        End;
      End;
 2 : Begin  // Hotspot Logları
       if hotspot_kayit then
        begin
          bos.LoadFromFile(log_yolu+'\HotspotLog_'+tarih+'.txt');
          bos.Add(Log);
          bos.SaveToFile(log_yolu+'\HotspotLog_'+tarih+'.txt');
        End;
      End;
 3 : Begin  // Diğer Loglar
      if diger_kayit then
        begin
          bos.LoadFromFile(log_yolu+'\DigerLog_'+tarih+'.txt');
          bos.Add(Log);
          bos.SaveToFile(log_yolu+'\DigerLog_'+tarih+'.txt');
        End;
      End;
 end;

bos.Free;

end;


iyileştirmek adına yardmcı olabilirmisiniz ?

mesaj birleştirme:: 15 Ocak 2016, 11:16:22

procedure TForm1.Logu_yaz(data:string;file_yol:string);
var
  logFile : TextFile;
begin
  //Dosyayı Aç
  AssignFile(logFile,file_yol);
  Rewrite(logFile);
  //Datayı Yaz
  WriteLn(logFile,data);
  //Dosyayı Kapat
  CloseFile(LogFile);
 // Reset(LogFile);
end;


böyle birşey kullandığımda da son gelen log dosyasını txt dosyasının hep 1.satırına yazıyor.

mesaj birleştirme:: 14 Ocak 2016, 11:33:59

procedure TForm1.Logu_yaz(data:string;file_yol:string);
var
logFile : TextFile;
begin
    AssignFile(logFile, file_yol);
    Reset(logFile);
    Append(logFile);
    Writeln(logFile, data);
    CloseFile(logFile);
end;


Bu şekilde oldu gibi duruyor. bakalım test sonucu ne olacak.

Gökhan BEKEN

1-Log dosyasını sürekli açıp kapatmayın, bu hızlı ve sürekli loglamalarda sıkıntı çıkartır.
2-Dosyayı hiç kapatmayın.
3-Kaydedilmesini istediğiniz zaman f_sync işlemini kullanın.
Özel mesaj okumuyorum, lütfen göndermeyin.

ByTEK

Dediğinizde haklısınız fakat olası bir durumda program kapanırsa kayıt edemezsek problem olur.

bizim için önemli çünkü bir satır log kaybı olası bir yasal soruşturmada sıkıntılı olacaktır.

Bakınız : Web5651 Loglama

Gökhan BEKEN

Sıkıntı yok, fflush (f_sync)  zaten dosyayı kapatmadan kaydeder ve tekrar açmanıza gerek kalmaz.
Özel mesaj okumuyorum, lütfen göndermeyin.

ByTEK

Anladım Hocam Delphi Tarafında f_sync komutu bulamadım.

Gökhan BEKEN

fflush diye arattım böyle yazılıyormuş: FlushFileBuffers(fs.Handle);
kaynak: http://stackoverflow.com/questions/787019/how-to-flush-a-tfilestream
Özel mesaj okumuyorum, lütfen göndermeyin.

ByTEK