Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bei wachsendendem Logfile auf bestimme Zeile reagieren (https://www.delphipraxis.net/171915-bei-wachsendendem-logfile-auf-bestimme-zeile-reagieren.html)

Furtbichler 2. Dez 2012 15:24

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Merk Dir die Größe der Datei seit dem letzten Prüfvorgang (=StartPos).
Zum periodischen Prüfen:

1. Gehe in der Datei an Die Stelle 'StartPos+1'
2. Suche ab da bis zum Ende der Datei.
3. Anschließend setzt Du StartPos auf <Größe der Datei>

StartPos ist am Anfang 0.

Bummi 2. Dez 2012 16:28

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
@Furtbichler > #7

Popov 2. Dez 2012 16:49

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Wobei man gelegentlich das Archivieren von Logfiles nicht vergessen sollte. Eine zeitlang klappt das Anhängen. Ich hab mal eine Log von knapp 2 GB gesehen. Kunde meinte, dass das Programm früher etwas schneller war. Also ab und zu vorne etwas abschneiden, archivieren und alles anpassen.

Furtbichler 2. Dez 2012 19:20

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Zitat:

Zitat von Bummi (Beitrag 1194007)
@Furtbichler > #7

Das ist nicht das Gleiche, denn er spricht in seinem Ansatz von 'Zeilen' und mir ist nicht bekannt, das ich in die X.te Zeile per Filestream springen kann.

Na ja, eigentlich ist es doch das Gleiche aber eben nicht ganz.:roll:

Ajintaro 3. Dez 2012 14:56

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Ich habe mir erstmal folgende Loesung gebastelt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Inhalt: string;
  p:integer;
begin
  Assignfile(Src,'C:\Users\tomatenmann\Documents\logoutput\Log.txt');
  Reset(Src);
  memo1.Clear;
    while not EOF(Src) do
    begin
      ReadLn(Src, Inhalt);
      p := Pos('Suchtext', Inhalt);
      if p > 0 then
      begin
       //Reaktion auf gefundenen Suchstring
       memo1.Lines.Add(Inhalt);
      end;
    end;
    CloseFile(Src);
end;
Mit diesem Code werden beim Programmstart nur die Zeilen in das Memo uebertragen, welche dem Suchstring entsprechen.
Jeder weitere Eintrag in das Memo loest die gewuenschte Reaktion aus.

Funktioniert.

Das dumme ist:
Wenn das Logfile mehrere Dutzend Megabytes gross wird kann es auf Dauer etwas unperformant werden, da ich bei jeder pruefung das gesamte logile zeilenweise neu einlese.
Bloed ist auch dass mein Programm das File fuer andere Anwendungen "blockiert", deshalb muss ich bei jedem Vorgang das file wieder "closen"

Bummi 3. Dez 2012 15:44

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Der bereits mehrfach erwähnte FileStream ([fmopenRead,fmShareDenyNone]), lesen ab letztem bekannten Ende, sollte diese Probleme lösen.

p80286 3. Dez 2012 16:48

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Fassen wir doch mal zusammen,
Du hast eine Program (prg1) das in eine Datei schreibt (lg1).
in dieser Datei werden verschiedene vordefinierte strings geschrieben,
es wird kein Datum und keine Uhrzeit geschrieben.

Zu einem beliebigen Zeitpunkt wird ein weiteres Program (prg2) gestartet, das alle Einträge, die nach prg2.Start in das lg1 gemacht werden, auf bestimmte Inhalte überprüft und ggf. eine optische und/oder akustische Meldung absetzt.

ist das soweit richtig?

Gruß
K-H

Ajintaro 3. Dez 2012 17:22

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Zitat:

Zitat von p80286 (Beitrag 1194128)
Fassen wir doch mal zusammen,
Du hast eine Program (prg1) das in eine Datei schreibt (lg1).
in dieser Datei werden verschiedene vordefinierte strings geschrieben,
es wird kein Datum und keine Uhrzeit geschrieben.

Zu einem beliebigen Zeitpunkt wird ein weiteres Program (prg2) gestartet, das alle Einträge, die nach prg2.Start in das lg1 gemacht werden, auf bestimmte Inhalte überprüft und ggf. eine optische und/oder akustische Meldung absetzt.

ist das soweit richtig?

Gruß
K-H

zu 100% korrekt.

Bjoerk 3. Dez 2012 20:32

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Ich würd' mir was von TStringList ableiten:

Delphi-Quellcode:
  TLogFile = class(TStringList)
  private
    FLoadCount: integer;
    FFileName: string;
  public
    procedure UpDate;
    procedure Refresh;
    function IndexOfSubString(const SubStr: string; var Index: integer): integer;
    function DeleteSubString(const SubStr: string): boolean;
    property LoadCount: integer read FLoadCount;
    property FileName: string read FFileName;
    constructor Create(const AFileName: string);
  end;
Delphi-Quellcode:
constructor TLogFile.Create(const AFileName: string);
begin
  inherited Create;
  FFileName:= AFileName;
  FLoadCount:= 0;
  Refresh;
end;

procedure TLogFile.Refresh;
begin
  if FileExists(FFileName) then
  begin
    LoadFromFile(FFileName);
    FLoadCount := Count;
  end;
end;

procedure TLogFile.Update;
begin
  if FileExists(FFileName) then
    LoadFromFile(FFileName);
end;

function TLogFile.IndexOfSubString(const SubStr: string; var Index: integer): integer;
var
  I: integer;
begin
  UpDate;
  Result := -1;
  Index := 0;
  for I:= FLoadCount to Count -1 do
  begin
    Index:= Pos(SubStr, Strings[I]);
    if Index > 0 then
    begin
      Result := I;
      Break;
    end;
  end;
end;

function TLogFile.DeleteSubString(const SubStr: string): boolean;
var
  I, J: integer;
  S: string;
begin
  Result:= false;
  I:= IndexOfSubString(SubStr, J);
  if I > -1 then
  begin
    Result:= true;
    S:= Strings[I];
    System.Delete(S, J, Length(SubStr)); // ???
    Strings[I]:= S;
  end;
end;

DeddyH 3. Dez 2012 20:37

AW: Bei wachsendendem Logfile auf bestimme Zeile reagieren
 
Hat eigentlich jemand #10 bemerkt? Wozu sollte man die komplette Datei in den Speicher laden, wenn man nur einen Bruchteil davon braucht? Wenn man sich die Dateigröße beim Programmstart merkt, muss man doch nur ab dort untersuchen, wenn man über eine Änderung informiert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 Uhr.
Seite 2 von 3     12 3      

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 by Thomas Breitkreuz