fhem Log Überwachung inkl. Benachrichtigung

Begonnen von raiderxxl, 11 April 2018, 12:02:19

Vorheriges Thema - Nächstes Thema

raiderxxl

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
FHEM VM Ubuntu-Server auf Intel® NUC-Kit NUC6i5SYH ESXi 6.5
FHEM auf Raspberry2 OSMC Hyperion und TTS

Homematic,TradfriHub und Lampen,WIFILight,Fritzbox,FritzDECT,NanoCul433,IT Steckdosen,Diverse Nachbar-Sensoren,XiaomiZigbee,
ESP_Signalduino,ESPEasy,Amad,HarmonyHub,WLED,MQTT,Tasmota....

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Omega

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:&currentlogfile])))[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


NUC6i3SYH (FHEM 5.8 in VM)
Homematic: HMLAN, HMUSB, HM-Sec-SD, HM-CC-RT-DN, HM-TC-IT, ... + diverse weitere
LaCrosseGateway, ESPEasy
ZWave

raiderxxl

Hallo Holger vielen Dank!

Werde ich gleich mal versuchen ....

Grüßle

Pascal
FHEM VM Ubuntu-Server auf Intel® NUC-Kit NUC6i5SYH ESXi 6.5
FHEM auf Raspberry2 OSMC Hyperion und TTS

Homematic,TradfriHub und Lampen,WIFILight,Fritzbox,FritzDECT,NanoCul433,IT Steckdosen,Diverse Nachbar-Sensoren,XiaomiZigbee,
ESP_Signalduino,ESPEasy,Amad,HarmonyHub,WLED,MQTT,Tasmota....

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

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?


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

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 >:( .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Damian

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:&currentlogfile])))[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 .

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Beta-User

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:&currentlogfile])))[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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

raiderxxl

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
FHEM VM Ubuntu-Server auf Intel® NUC-Kit NUC6i5SYH ESXi 6.5
FHEM auf Raspberry2 OSMC Hyperion und TTS

Homematic,TradfriHub und Lampen,WIFILight,Fritzbox,FritzDECT,NanoCul433,IT Steckdosen,Diverse Nachbar-Sensoren,XiaomiZigbee,
ESP_Signalduino,ESPEasy,Amad,HarmonyHub,WLED,MQTT,Tasmota....

Beta-User

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:&currentlogfile])))[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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Parador

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:&currentlogfile])))[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:&currentlogfile])))[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!

Beta-User

...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;;
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors