NEWS
[Vorlage] JS: Log-Datei aufbereiten für VIS
-
Sinn und Zweck dieses Scripts
Der ioBroker loggt alle Aktionen der Adapter und Scripte entsprechend mit, einzusehen in der ioBroker-Administration, linke Seite Menüpunkt "Log".
Dieses Script bietet nun folgendes:- Log im VIS darstellen: Entsprechend gefiltert, also etwa nur Warnungen und Fehler, nur Ausgaben eines bestimmten Adapters, usw.
- Auf bestimmte Log-Ereignisse reagieren
Dabei nimmt das Script jeden neuen Logeintrag des ioBrokers und wendet entsprechend gesetzte Filter an, um den Eintrag dann in den entsprechenden Datenpunkten dieses Scripts abzulegen.
Es stehen auch JSON-Datenpunkte zur Verfügung, mit diesen kann im vis eine Tabelle ausgegeben werden. Z.B. über das Widget 'basic - Table' oder hier im Beispiel über Widget 'materialdesign - Table' (Material Design Widgets werden dafür benötigt).
Über die Filter kann man auch einzelne Geräte-Logs oder JS/Blockly-Logs ausgeben. Beispiel für ein "Garagentor":
Installation / Einrichtung
Ursprünglicher Beitrag von mir vom 18.07.2018:
Hallo,
ich überlege, dass ich per JavaScript die Log-Datei unter "/opt/iobroker/log/iobroker.YYYY-MM-DD.log" z.B. alle paar Sekunden auslese und Warnungen und Fehler in zwei separate Datenpunkte schreibe (Datenpunkt hält dann z.B. die letzten 30 Werte vor). Diese würde ich dann übers vis entsprechend in einer View ausgeben.
Bevor ich das Rad neu erfinde, gibt es schon ein solches Script? Habe nur das hier gefunden: https://forum.iobroker.net/topic/1246/geloest-log-daten-im-vis-anzeigen
Falls das noch keiner erstellt hat (was mich etwas wundern würde, wäre ja praktisch - auch weil manche Adapter das Log voll müllen, da könnte man dann noch ausfiltern etc.) dann werde ich da selbst was schreiben und hier zur Verfügung stellen.
Viele Grüße
-
Puhh, dass wäre wirklich Nixe mit Filter. Somit könnte man die ganzen erstellten Debugmeldungen in einem Fenster anzeigen lassen.
Ist zwar zu hoch für mich, aber ich wäre happy über so etwas.
Gesendet von iPhone mit Tapatalk
-
Schaut mal im GitHub beim systeminfo Adapter. Da gibts glaube ich ein issue dazu. Hängt euch da doch mal dran.
Gesendet vom Handy …
-
Danke für Eure Antworten. Ich habe jetzt selbst ein Script geschrieben, es liest regelmäßig (einstellbar, z.B. alle 2 Minuten) die tägliche Log-Datei des ioBrokers aus und setzt das Ergebnis in Datenpunkte, aufgeteilt nach Log-Level (error, info, warn, etc.). Neue Log-Einträge werden in den Datenpunkten ergänzt. Es stehen JSON-Datenpunkte zur Verfügung, mit diesen kann im vis eine Tabelle ausgegeben werden (z.B. über das Widget 'basic - Tabelle').
Bei mir läuft das Script nun so wie es soll Ich werde noch weitere konfigurierbare Filter später hinzufügen.
Wonach würdet Ihr denn gerne noch filtern?
<size size="150">Das Script ist ab sofort auf GitHub:</size>
-
Hallo Mic danke für das script bekommen aber folgende Fehlermeldung
Gruß Stephan
-
Hi Stephan, danke für Dein Feedback. Ist oben korrigiert (Version 0.2), war ein falscher Name einer Funktion referenziert.
Ich arbeite derzeit noch an personalisierten Filtern, z.B. alle Errors und Warnings nach Suchbegriff (z.B. denon.0) in einem State, etc.
Update folgt.
-
Ich habe das Script nun entsprechend erweitert, es werden Datenpunkte mit optionalen Filtern und Blacklist erstellt.
Alles frei konfigurierbar.
Beispiel für einen Datenpunkt:
// Beispiel für individuellen Eintrag. Hier wird Euer Hubschrauber-Landeplatz // überwacht :-) Wir wollen nur Einträge vom Adapter 'hubschr.0'. // Dabei sollen entweder Wetterwarnungen, Alarme, oder UFOs gemeldet werden. // Alles unter Windstärke "5 Bft" interessiert uns dabei nicht, daher haben // wir '0 Bft' bis '4 Bft' auf die Blackliste gesetzt. { id: 'hubschrauberlandeplatz', filter_all: ['hubschr.0'], filter_any: ['wetterwarnung', 'alarm', 'ufo'], blacklist: ['0 Bft', '1 Bft', '2 Bft', '3 Bft', '4 Bft'], },
Läuft soweit stabil bei mir…
Ausgabebeispiel im vis, Widget 'basic - Tabelle':
Script ab sofort bei GitHub: https://github.com/Mic-M/iobroker.logfile-script
-
Fehler:
host.Medion 2018-07-22 18:18:01.396 error instance system.adapter.javascript.0 terminated with code 0 (OK) host.Medion 2018-07-22 18:18:01.396 error Caught by controller[0]: at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3) host.Medion 2018-07-22 18:18:01.396 error Caught by controller[0]: at script.js.Sigi.Log_Script_für_ioBroker:330:9 host.Medion 2018-07-22 18:18:01.396 error Caught by controller[0]: at L_processLogAndSetToState (script.js.Sigi.Log_Script_für_ioBroker:409:43) host.Medion 2018-07-22 18:18:01.396 error Caught by controller[0]: TypeError: Cannot read property 'substr' of undefined javascript.0 2018-07-22 18:18:01.354 error TypeError: Cannot read property 'substr' of undefined at L_processLogAndSetToState (script.js.Sigi.Log_Script_für_ioBroker:409:43) at script.js.Sigi.Log_Script_für_ioBroker:330:9 at FSReqW javascript.0 2018-07-22 18:18:01.354 error uncaught exception: Cannot read property 'substr' of undefined
Habe den Log Pfad angepasst, da Windows 10…
Konfiguration: Pfade ******************************************************************************/ // Pfad, unter dem die States in den Objekten angelegt werden. const L_STATE_PATH = 'javascript.'+ instance + '.' + 'mylog'; // Pfad zu dem Log-Verzeichnis auf dem Linux-Rechner. // Der Standard-Pfad ist '/opt/iobroker/log/'. const L_LOG_PATH = '/iobroker/log/'; // Leer lassen! Nur setzen, falls ein eigener Filename für das Logfile verwendet wird const L_LOG_FILENAME = '';
-
Hey, wollte das Script heute mal ausprobieren, aber es kommen leider immer Fehler, wo der ganze Javascript Adapter neu gestartet wird.
Habe im Script bisher nichts geändert, nur folgendes Hinzugefügt:
-
Danke für Eure Rückmeldung, ich konnte das Problem nachstellen, das ist schon mal das wichtigste
Bugfix folgt.
-
Problem nun behoben, hier die neue Version 0.4:
-
Leider wird bei mir nichts im "garten" angezeigt. Was habe ich falsch gemacht?
// // Die Filter-Einträge können natürlich beliebig geändert und erweitert werden, // bitte aber den Aufbau beibehalten. // const L_FILTER = [ { id: 'all', // wir wollen hier alle Logeinträge, keine Filterung filter_all: ['', ''], // wird ignoriert, wenn leer filter_any: ['', ''], // wird ignoriert, wenn leer blacklist: ['', ''], // wird ignoriert, wenn leer }, { id: 'debug', filter_all: [' - debug: '], // nur Logeinträge mit Level 'debug' filter_any: ['', ''], blacklist: ['', ''], }, { id: 'info', filter_all: [' - info: '], // nur Logeinträge mit Level 'info' filter_any: ['', ''], blacklist: ['', ''], }, { id: 'warn', filter_all: [' - warn: '], // nur Logeinträge mit Level 'warn' filter_any: ['', ''], blacklist: ['', ''], }, { id: 'error', filter_all: [' - error: '], // nur Logeinträge mit Level 'error' filter_any: ['', ''], blacklist: ['', ''], }, { id: 'warnanderror', filter_all: ['', ''], filter_any: [' - error: ', ' - warn: '], blacklist: ['javascript.0 ^', 'no playback content', ''], }, // Beispiel für individuellen Eintrag. Hier wird Euer Hubschrauber-Landeplatz // überwacht :-) Wir wollen nur Einträge vom Adapter 'hubschr.0'. // Dabei sollen entweder Wetterwarnungen, Alarme, oder UFOs gemeldet werden. // Alles unter Windstärke "5 Bft" interessiert uns dabei nicht, daher haben // wir '0 Bft' bis '4 Bft' auf die Blackliste gesetzt. //{ //id: 'hubschrauberlandeplatz', //filter_all: ['hubschr.0'], //filter_any: ['wetterwarnung', 'alarm', 'ufo'], //blacklist: ['0 Bft', '1 Bft', '2 Bft', '3 Bft', '4 Bft'], //}, { id: 'garten', filter_all: ['javascript.0'], filter_any: ['garten', 'alarm', 'info'], blacklist: ['', ''], }, ];
-
Leider wird bei mir nichts im "garten" angezeigt. Was habe ich falsch gemacht? `
Kannst Du mir mal den Auszug der Logdatei schicken (hier oder PM), der das betrifft und der nicht erscheint? Am besten direkt den von der Server-Datei, aber der aus dem ioBroker geht auch, brauche nur 1-2 Beispiele.
-
Habe gerade mal nach gesehen, jetzt funktioniert es und die States sind gefüllt
-
Update auf Version 0.5.
-
Neuer Parameter "clean": damit kann man Zeichenfolgen aus den Logzeilen entfernen.
-
Neuer Parameter "columns" für die JSON-Tabellen-Ausgabe fürs vis: Damit kann man die Spalten sortieren und nicht gewünschte entfernen
-
Neuer Datenpunkt "JSONcount" für jeden Filter. Da wird schon mal die Anzahl der Logzeilen angezeigt.
Hier: https://github.com/Mic-M/iobroker.logfile-script
Neues To Do für mich:
Möchte einen Button "Leeren" oder so für jeden Filter als Datenpunkt zur Verfügung stellen. Damit kann man dann das Log leeren. Wäre cool für das vis z.B. für Metro-Widgets, die ja die Anzahl von Meldungen anzeigen. Dann kann man reingehen, diese lesen und dann als "gelesen markieren". Dann wird das Log geleert und die Anzahl des Metro-Widgets auf 0 gesetzt.
Sollte der Sommer verregnet werden, werde ich mich mal daran setzen und als Adapter zur Verfügung stellen. Adapter-Programmierung sind für mich noch böhmische Dörfer, da muss ich mich erst mal einarbeiten, und das kostet echt Zeit.
-
-
Erst mal vielen Dank für das Script. Es funktioniert einwandfrei.
Hast du eine Idee wie ich es lösen kann, dass ich es auf einem Multihostsystem betreiben kann und das log von beiden Systemen (in einer Tabelle) sehe?
Aktuell zeigt er mir das Log nur von dem system, auf dem auch die Java Engine installiert ist. Ich könnte auf dem anderen Host nun auch Java Installieren, müsste dann aber zwei Logs in VIS darstellen. Hätte das gerne möglichst ein einer Tabelle
Zusätzlich noch allgemein die Frage, kann ich im VIS das Basic Table JSON Widget farblich anders formatieren? Das Grau/Schwarz passt nicht so ganz in meine Views
Danke!
Viele Grüße Walkinlarge
-
Hey, sei gegrüßt,
also ich finde das Script wirklich nice, danke dafür.
Aber wie kann ich die JSON Tabelle einstellen, wie sie aussehen soll und was alles angezeigt werden soll? da blicke ich so ohne Anleitung noch nicht durch :shock:
-
Hi Walkinlarge,
danke für Dein Feedback.
Hast du eine Idee wie ich es lösen kann, dass ich es auf einem Multihostsystem betreiben kann und das log von beiden Systemen (in einer Tabelle) sehe?
Aktuell zeigt er mir das Log nur von dem system, auf dem auch die Java Engine installiert ist. Ich könnte auf dem anderen Host nun auch Java Installieren, müsste dann aber zwei Logs in VIS darstellen. Hätte das gerne möglichst ein einer Tabelle `
Ich habe keinerlei Erfahrungen mit Multihostsystemen, aber man könnte natürlich auch mehrere Log-Files gleichzeitig unterstützen in dem Script.
Der Pfad zum Logfile ist ja typischerweise '/opt/iobroker/log/'. Wie ist denn der Pfad bei Dir dann zum log-Verzeichnis vom zweiten System, wenn Du von System 1 darauf per JavaScript zugreifst? Kann man diesen auch einfach in eine Variable legen wie etwa 'XYZ_System2/xx/yy/opt/iobroker/log/'?
Zusätzlich noch allgemein die Frage, kann ich im VIS das Basic Table JSON Widget farblich anders formatieren? Das Grau/Schwarz passt nicht so ganz in meine Views `
Ich bin da auch noch am basteln Ich habe bei mir auf grau/weiß eingestellt. Dazu im Widget bei CSS-Klasse z.B. "test" eintragen:
Dann im Tab "CSS" z.B. folgendes hinzufügen:
! ````
.test-th1 {
width: 40px;
text-align: center;
color: black;
font-size: 11px;
padding: 3px;
}
! .test-tr:nth-child(odd) {
font-size: 11px;
color: black;
background-color: white;
}
! .test-tr:nth-child(even) {
font-size: 11px;
color: black;
background-color: #F2F2F2;
}Farben dann im CSS beliebig anpassen ( background-color:).
-
Aber wie kann ich die JSON Tabelle einstellen, wie sie aussehen soll und was alles angezeigt werden soll? da blicke ich so ohne Anleitung noch nicht durch :shock: `
Hi quorle,
danke auch für Dein Feedback. Die anzuzeigenden Spalten stellst Du in der Konfiguration des Scripts ein. Hier als Beispiel, beachte dabei die Zeile, die mit "columns", also Spalten anfängt:
{ id: 'hubschrauberlandeplatz', filter_all: ['hubschr.0'], filter_any: ['wetterwarnung', 'alarm', 'ufo'], blacklist: ['0 Bft', '1 Bft', '2 Bft', '3 Bft', '4 Bft'], clean: ['****', '!!!!', 'ufo gesichtet'], columns: ['date','level','source','msg'], },
Damit werden standardmäßig mit der JSON-Tabelle die Spalten "Date", "Level" (also debug, error, info, etc.), "Source" (also z.B. Adaptername), sowie "Msg", also der Logeintrag angezeigt. Möchtest Du z.B. nur 2 Spalten mit Datum und Logeintrag, so änderst Du die Zeile wie folgt:
columns: ['date','msg'],
Soll z.B. in der 1. Spalte der Logeintrag (msg) stehen und in der 2. Spalte das Datum, so änderst Du die Reihenfolge:
columns: ['msg','date'],
-
<size size="150">Update auf Version 0.5.1 BETA</size>
Jetzt kann man im vis einen Button "Log als gelesen markieren" (oder ähnlichen Namen dafür) einbauen. Beim Drücken auf den Button wird dann im vis die JSON-Tabelle geleert, und nur noch neuere Logs werden danach angezeigt (Aktualisierung dauert etwas, je nach Einstellung von L_SCHEDULE im Script).
Dazu sind pro Filter folgende States verfügbar:
<list type="decimal">4. log[Filter]JSONclear –> das ist der Button, der im vis auszulösen wird.-
log[Filter]JSONclearDateTime –> hier wird dann aktuelles Datum/Uhrzeit gesetzt. Alle älteren Logeinträge werden dann im vis nicht mehr gezeigt
-
log[Filter]JSONcount –> Anzahl Log-Einträge, kann ebenfalls dann in vis genutzt werden z.B. zur Anzeige auf Widget.
So kann man sich z.B. bestimmte Meldungen filtern, und sobald gelesen auf den Button drücken, dann erscheinen diese nicht mehr.
Das ganze noch als Beta-Release, ich muss das noch ein wenig testen, aber soweit funktioniert es sehr gut bei mir.
Sieht dann so in meinem Test-vis aus. Unten sieht man, dass es 60 neue Logs zu lesen gibt. Auf "Errors and "Warning" kann dann der Button oben rechts gedrückt werden, dann werden diese wieder auf 0 gesetzt.
-