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
siehe Commandref zu FileLog (http://fhem.de/commandref_DE.html#FileLog):
set Logfile reopen
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`;
}
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
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.";;}
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