Zeilen aus dem aktuellen Logfile löschen

Begonnen von Elektrolyt, 28 Dezember 2016, 21:39:18

Vorheriges Thema - Nächstes Thema

Elektrolyt

Hallo allerseits,

ich bin Perl-Anfänger und daher meine Frage wie man Folgendes macht:
Ich möchte ein zugemülltes Logfile über die Fhem Kommandozeile durch Aufruf einer sub in 99_myUtils.pm bereinigen.
In der Routine wird ein Perl-Oneliner als Systemaufruf ausgelöst, dem ein Teilstring der zu löschenden Zeilen aus dem Logfile übergeben wird.
Also:
99_myUtils.pm:
# Zeilen aus dem aktuellen Logfile löschen:
# Beispiel: {rml("Error dewpoint:")}
sub
rml($){
  my $pattern=shift;
  my $mylog=InternalVal("global","currentlogfile","nix");
  qx(perl -n -i.bak -e "print unless /$pattern/" $mylog;)
}


Funktioniert wunderbar, - nur... nach dem Aufruf hat Fhem anscheinend den Handle zum Logfile verloren.
Jedenfalls werden keine weiteren Einträge mehr in das Logfile geschrieben, so dass ein Fhem-Restart notwendig ist, um die Verknüpfung wieder herzustellen.
Mir ist klar, dass meine Vorgehensweise etwas "grobschlächtig" ist...
Ich würde mich über ein paar gute Ratschläge freuen!

Beste Grüße, Jens
PasPi und Cb2 als Server, COC, CUL868, NanoCUL, RFBee als CUL_RFR, Buderus GB172 / 2 Kreise / CP / KM200 , FRM, FS20, IT, Revolt, CUL_EM, HMS, KS300, OWServer,  ECMD, VSM-102, FHEM2FHEM, einige DOIFs...

Benni


Dietmar63

bei mir funktioniert dies:


sub stripFhemLog {
    my $log = "./log/fhem.log";
   
    my $now = time();
    my @lastSevenDays     = map {FmtDate($now - $_*86400)} (0..6);
    my $lastSevenDaysList = join("|", @lastSevenDays);
   
    my $res = `egrep "$lastSevenDaysList" $log >/tmp/tmp.log`;
    $res = `cat /tmp/tmp.log >$log`;
}

oder so:
sub stripFile($) {
    my ($datei) = @_;

    my $res = `tail -n1000 $datei >/tmp/tmp.log`;
    $res = `cat /tmp/tmp.log >$datei`;

}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Elektrolyt

Vielen Dank für eure schnellen Vorschläge!
...eine commandref-Watschen habe ich nicht erwartet, aber berechtigt. :–)
Ich werde das reopen morgen einsetzen, mich über den "Tatort-Reiniger" freuen und das Thema dann schließen.

Grüße, Jens
PasPi und Cb2 als Server, COC, CUL868, NanoCUL, RFBee als CUL_RFR, Buderus GB172 / 2 Kreise / CP / KM200 , FRM, FS20, IT, Revolt, CUL_EM, HMS, KS300, OWServer,  ECMD, VSM-102, FHEM2FHEM, einige DOIFs...

igami

Hab mir auch schon mal sowas gebastelt
Zitat von: igami am 06 April 2016, 12:34:57

define c_wipelog cmdalias wipelog .+ AS {qx(sed -r '/.*$EVENT.*/d' $currlogfile > $currlogfile.tmp && cat $currlogfile.tmp > $currlogfile && rm $currlogfile.tmp);; Log 1, "Logfile um Zeilen mit \"$EVENT\" bereinigt.";;}

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Elektrolyt

Ich hab's gerade mal probiert.

@Benni:
Dein Hinweis war prima! Nur leider funktioniert er (bei mir) nicht.
Lt. Commandref sollte ein reopen möglich sein, Fhem hat aber trotz set Logfile reopen keine Einträge mehr erzeugt.

Vielen Dank auch an Dietmar.
Deine Ideen sind klasse!
In deinem Code ist der Hinweis cat zu verwenden und das funktioniert erstaunlicher Weise - im Gegensatz zum perl-Oneliner!

Ganz großes Dankeschön an igami!
Genauso! Perfekt!

Ich habe aus Neugier meine Routine entsprechend verändert und dank cat geht auch das jetzt prima!

# Zeilen aus dem aktuellen Logfile löschen:
# {rml("Error dewpoint:")}
sub
rml($){
  my $pattern = shift;
  my $mylog   = InternalVal("global","currentlogfile","nix");
  my $tmp     = $mylog. '.tmp';
  qx(cp $mylog $tmp && perl -ne "print unless /$pattern/" $tmp | cat >$mylog);
  Log 1, "lines containing \"$pattern\" stripped from $mylog with backup to $tmp"
}


Das Folgende funktioniert leider nicht - auch nicht, wenn nachträglich im Frontend set Logfile reopen eingegeben wird.

# Zeilen aus dem aktuellen Logfile löschen:
# {rml1("Error dewpoint:")}
# Achtung Fhem kann nach Aufruf nicht mehr ins Logfile schreiben!
sub
rml1($){
  my $pattern=shift;
  my $mylog=InternalVal("global","currentlogfile","nix");
  qx(perl -n -i.bak -e "print unless /$pattern/" $mylog;);
  fhem ("set Logfile reopen")
}


Warum qx(perl -n ... blockierend wirkt, ist nach wie vor unklar.
Warum set Logfile reopen nicht wirkt, ebenso.

Ich habe noch eine Frage:
Kann man die Routine so gestalten, dass das WEB-Frontend nach Aufruf aus der Kommandozeile NICHT zur Startseite wechselt?


Grüße, Jens
PasPi und Cb2 als Server, COC, CUL868, NanoCUL, RFBee als CUL_RFR, Buderus GB172 / 2 Kreise / CP / KM200 , FRM, FS20, IT, Revolt, CUL_EM, HMS, KS300, OWServer,  ECMD, VSM-102, FHEM2FHEM, einige DOIFs...