Hallo, ich hab über die Suche nichts gefunden deshalb stelle ich hier mal diese Frage...
Ich möchte gerne mein normales fhem Log überwachen.. quasi ein doif das mich wie auch immer informiert wenn innerhalb von X Sekunden/Minuten X Logeinträge hinzugekommen sind... da es ja ein fake lof ist sehe/weiss ich nicht die Definition.. Muss ja was mit dem Loglevel zu tun haben (Verbose) sonnst hätte ich mir ein doif gebaut das nach dem loglevel geht ...
Geht sowas überhaupt? Währ ne coole Funktion, ich hatte schon öfters irgendwelche Modul-ausfälle die mir das fhemlog geflutet haben und ich habe es nicht mitbekommen...
Grüßle
Pascal
Du könntest mit einem at alle paar Minuten/Stunden die Zahl der Zeilen des logs mit @fileread() (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#FileRead) auslesen und das als reading zu dem at speichern.
Vor dem update des readings sehen, ob dein eingestellter Schwellwert überschritten ist (Vergleich neu - alt) und ggf. die Info senden, dass das der Fall ist...
Habe das selber für mich auch vor kurzem so getestet (nach diesbezüglichen Hinweisen aus dem Forum):
Ein DOIF, dass regelmäßig die alte und die aktuelle Anzahl Zeilen im Logfile ermittelt und in Readings festhält
defmod doif.linesInTheFile DOIF ([+00:20:05]) (setreading Logfile linesInTheFileOld [Logfile:linesInTheFile]) (setreading Logfile linesInTheFile {(split(' ',qx (wc -l [Logfile:¤tlogfile])))[0]})
attr doif.linesInTheFile do always
attr doif.linesInTheFile room Server
Logfile ist das Fakelog Device.
Ein 2. DOIF, dass bei einer größeren Differenz eine Meldung ausgibt
defmod doif.Logfile.Alarm DOIF ([Logfile:linesInTheFile] - [Logfile:linesInTheFileOld] > 15) (set pushSM_G935F message FHEM Logfile kontrollieren)
attr doif.Logfile.Alarm do always
attr doif.Logfile.Alarm cmdpause 1200
attr doif.Logfile.Alarm room Server
Nachteil: wenn FHEM mit sich selber beschäftigt ist, wird zwar das Log vollgeschrieben, die Meldung kann aber nicht mehr abgesetzt werden (ich habe derzeit das Problem, das FHEM ca. 1 x pro Woche wegen Speichermangel (bei 2GB RAM) "stirbt").
Aus diesem Grund habe ich diese Kontrolle auf die Systemebene verlagert. Wer meine "Probleme" nicht hat, kann aber gut mit den 2 DOIFs arbeiten.
LG
Holger
Hallo Holger vielen Dank!
Werde ich gleich mal versuchen ....
Grüßle
Pascal
Aber warum packt Ihr das nicht alles in ein bißchen Perl-Code für ein einfaches at?
Also at alle +*20:05, dann aktuelle Zeilenzahl ermitteln, vergleichen, ggf. Info versenden, Zeilenzahl merken.
Ist das soviel schwieriger, als 2 weitere Devices zu verbraten und "do always" zu verwenden? Alle Bausteinchen sind ja jetzt bekannt...
Just my2ct.
Zitat von: Beta-User am 11 April 2018, 12:14:06
Du könntest mit einem at alle paar Minuten/Stunden die Zahl der Zeilen des logs mit @fileread() (
Ihr wisst aber schon, dass in jedem FileLog device ein reading "linesInTheFile" existiert?
Zitat von: betateilchen am 12 April 2018, 11:20:36
Ihr wisst aber schon, dass in jedem FileLog device ein reading "linesInTheFile" existiert?
Ist mir seit dem Post von Omega bekannt, aber danke nochmal für den Hinweis.
Zitat von: Beta-User am 12 April 2018, 11:25:53
Ist mir seit dem Post von Omega bekannt
da steht DOIF drin, das blendet meine optische Texterkennung automatisch aus.
Zitat von: betateilchen am 12 April 2018, 11:33:34
da steht DOIF drin, das blendet meine optische Texterkennung automatisch aus.
Geht mir fast genauso...
Und irgendwie werde ich den Verdacht nicht los, dass solche Konstruktionen dann zu sowas führen:
Zitat von: Omega am 12 April 2018, 10:14:55
[...]ich habe derzeit das Problem, das FHEM ca. 1 x pro Woche wegen Speichermangel (bei 2GB RAM) "stirbt").
Ist hier zwar vermutlich nicht so, dass diese zwei DOIFs sowas bewirken, aber irgendwie empfinde ich es auch als "leichtgewichtiger", das einfach der logischen Reihenfolge nach abzuarbeiten:
Zitat von: Beta-User am 12 April 2018, 11:07:30
Aber warum packt Ihr das nicht alles in ein bißchen Perl-Code für ein einfaches at?
Also at alle +*20:05, dann aktuelle Zeilenzahl ermitteln, vergleichen, ggf. Info versenden, Zeilenzahl merken.
Aber "do always" scheint einleuchtender zu sein >:( .
Zitat von: Beta-User am 12 April 2018, 11:07:30
Aber warum packt Ihr das nicht alles in ein bißchen Perl-Code für ein einfaches at?
Also at alle +*20:05, dann aktuelle Zeilenzahl ermitteln, vergleichen, ggf. Info versenden, Zeilenzahl merken.
Ist das soviel schwieriger, als 2 weitere Devices zu verbraten und "do always" zu verwenden? Alle Bausteinchen sind ja jetzt bekannt...
Just my2ct.
sehe ich auch so, deswegen alles in ein Device packen, ohne komplexe Attribute arbeiten und am besten Perl verwenden, damit es performanter ist ;)
defmod doif.linesInTheFile DOIF {
if ([+00:20:05]) {
fhem"setreading Logfile linesInTheFileOld [Logfile:linesInTheFile]";
fhem"setreading Logfile linesInTheFile {(split(' ',qx (wc -l [Logfile:¤tlogfile])))[0]}";
}
}
{if ([?Logfile:linesInTheFile] - [?Logfile:linesInTheFileOld] > 15 or [+20:00]) {
fhem"set pushSM_G935F message FHEM Logfile kontrollieren";
}
}
Stichwort: DOIF im Perl-Mode, siehe: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus
Den Code habe ich weitgehend von @Omega übernommen, ohne es auf Korrektheit zu prüfen .
Da versteht einer aber Spaß...
Aber wenn es um ungetesteten Code geht, wage ich es eben auch mal *grins*
defmod at_check_loggrowth at +*20:00 {my $actualLinesNr = {(split(' ',qx (wc -l [Logfile:¤tlogfile])))[0]};
my $delta = $actualLinesNr - ReadingsVal("Logfile","lastKnownLinesInTheFile",0);
fhem"set pushSM_G935F message FHEM Logfile kontrollieren, $delta lines more!" if ($delta > 15);
fhem"setreading Logfile lastKnownLinesInTheFile $actualLinesNr";
}
Beta-User
Guten Morgen...
Ihr wisst aber das ich das im Anfängerbereich gepostet hab...
Mir ist gerade das Hirn Explodiert... ;D
Danke! Werde beide Versionen auch mal testen...
Grüßle
Pascal
Zitat von: raiderxxl am 13 April 2018, 09:57:27
Mir ist gerade das Hirn Explodiert... ;D
ymmd ;D
Aber der Reihe nach nochmal, um das einfacher nachvollziehen zu können:
Zitat von: https://forum.fhem.de/index.php/topic,86860.msg793361.html#msg793361Also at alle +*20:05
defmod at_check_loggrowth at +*20:00 {}
Zitataktuelle Zeilenzahl ermitteln,
my $actualLinesNr = {(split(' ',qx (wc -l [Logfile:¤tlogfile])))[0]};
Zitatvergleichen,
my $delta = $actualLinesNr - ReadingsVal("Logfile","lastKnownLinesInTheFile",0);
... if ($delta > 15);
Zitatggf. Info versenden,
fhem"set pushSM_G935F message FHEM Logfile kontrollieren, $delta lines more!" if ($delta > 15);
ZitatZeilenzahl merken.
fhem"setreading Logfile lastKnownLinesInTheFile $actualLinesNr";
Egal, in welcher "Sprache" du das machst, es sind immer dieselben Schritte erforderlich - man kann nur darüber streiten, ob es sinnvoller ist, Variablen z.B. dann für später aufzuheben (zwei Readings) oder ob man nur interne Infos braucht (my $...), die hinterher auch wieder vergessen werden dürfen.
Zitat von: raiderxxl am 13 April 2018, 09:57:27
Ihr wisst aber das ich das im Anfängerbereich gepostet hab...
Eben drum hier auch nochmal die Erläuterung ;) . Es macht übrigens in jedem Fall Sinn, so einen Ablauf auch "in Worten" vorab zu beschreiben, dann kann man das leichter umsetzen (bzw. dann Fehler suchen, nach Bausteinchen recherchieren) usw...
Grüßle ebenfalls aus dem Schwabenland,
Beta-User
Hallo Zusammen,
ich habe mir die beiden Beispiele mal mit Copy&Paste bei mir angelegt... Leider klappen beide nicht, weil es mit der Ermittlung der Zeilen Probleme gibt.
Beim Beispiel von @Beta-User:
defmod at_check_loggrowth at +*20:00 {my $actualLinesNr = {(split(' ',qx (wc -l [Logfile:¤tlogfile])))[0]};
my $delta = $actualLinesNr - ReadingsVal("Logfile","lastKnownLinesInTheFile",0);
fhem"set pushSM_G935F message FHEM Logfile kontrollieren, $delta lines more!" if ($delta > 15);
fhem"setreading Logfile lastKnownLinesInTheFile $actualLinesNr";
}
habe ich als erstes Mal den ersten "at-Bereich" angepasst..
defmod at_check_loggrowth at +*00:20:00 {my $actualLinesNr = {(split(' ',qx (wc -l [Logfile:¤tlogfile])))[0]};
my $delta = $actualLinesNr - ReadingsVal("Logfile","lastKnownLinesInTheFile",0);
fhem"set pushSM_G935F message FHEM Logfile kontrollieren, $delta lines more!" if ($delta > 15);
fhem"setreading Logfile lastKnownLinesInTheFile $actualLinesNr";
}
Damit war dann ein "alle 20 Minuten" eingestellt. Allerdings wird bei mir das Reading immer mit folgendem Text gefüllt:
lastKnownLinesInTheFile HASH(0x58427c8)
wobei der Wert in Klammern immer wechselt... ich vermute also, dass eine Umrechnung nicht klappt...
Könnte da bitte nochmal jemand drüber schauen und mir weiterhelfen?
Vielen Dank bereits im Voraus!
...leider hatte ich den Ausgangscode auch nur kopiert...
Da war wohl irgendeine Spezialität drin, die in "normalem" "fhem-Perl" nicht geht. So sollte das passen (kann man noch etwas straffen):
defmod at_check_loggrowth at +*20:00 { \
my $clf = InternalVal("Logfile","currentlogfile","none");; \
my $actualLinesNr = qx (wc -l $clf);; \
$actualLinesNr =~ s,^(\d+).*,$1,g;; \
my $delta = $actualLinesNr - ReadingsVal("Logfile","lastKnownLinesInTheFile",0);; \
fhem"set pushSM_G935F message FHEM Logfile kontrollieren, $delta lines more!" if ($delta > 15);; \
fhem"setreading Logfile lastKnownLinesInTheFile $actualLinesNr";; \
}
my $clf = InternalVal("Logfile","currentlogfile","none");; my $line = qx (wc -l $clf);; $line =~ s,^(\d+).*,$1,g;;
Danke!