Remote Logging / z.B. Syslog Support

Hallo Symcon-Team,

gibt es die Möglichkeit Symcon-Logs zu einem zentralen Log-Server (z.B. Syslog) umzuleiten? Mittlerweile gibt es ja ein Modul (GitHub - demel42/IPSymconSyslog: Syslog-Client für IP-Symcon) mit dem Nachrichten manuell an Syslog versendet werden - was auch wunderbar funktioniert.
Nun würde ich aber gerne z.B. Script-Fehler / Symcon-Meldungen ebenfalls an einen Syslog-Server (Graylog) senden um diese dort automatisiert auszuwerten und ggf. Nachrichten zu versenden.

Ich sehe da spontan zwei Umsetzungsmöglichkeiten:

  • ein Logging-Modul welches immer die letzte Meldung in einer Symcon-Variable zur Verfügung stellt (vermutlich hohe Last). Somit können wir User mit entsprechenden Events und Scripte selber machen was wir möchten
  • alternativ: Weiterleiten der Nachrichten an einen Syslog-Server (mittlerweile Standard…)

Viele Grüße,
Markus

Ich kann mich da nur anschliessen. Wäre super, wenn man die Logs an Syslog weiterleiten könnte.

Könnte sich nicht das bestehende IPSymconSyslog Modul optional für die IPS_LOGMESSAGEs 10201 - 10207 registrieren und an den SyslogServer weiterleiten?

Gruß

Burkhard

Wäre dafür - einfach alles (oder auch gefiltert), was unter „Meldungen“ auf der Konsole erscheint an einen Syslog-Server weiterzuleiten wäre sehr hilfreich, um sporadisch auftretende Fehler zu finden…

Moin,

ich hatte noch nie mit dem registrieren von Nachrichten zu tun … müsste ich in dem Modul einfach nur ein RegisterMessage() auf die genannten Nachrichten-IDs durchführen und bekomme dann in der MessageSink() - Funktion alle diese Nachrichten mit und könnte die dann an den syslogd weiterleiten?
Oder ist da noch was zu beachten?

gruß
demel

Ja, das ist meine Idee gewesen. Das müsste eigentlich alles sein. Ist ja sicherlich schnell ausprobiert.

Gruß Burkhard

ok, probier ich mal.

gruß
demel

[quote="„demel42,post:7,topic:48958“]

ok, probier ich mal.

gruß
demel[/QUOTE]

Hallo,

klappt leider nicht. Habe folgendes gemacht:
im dem Modul habe ich das programmiert.


    public function ApplyChanges()
    {
        parent::ApplyChanges();
...
        $this->RegisterMessage(0, KL_MESSAGE);
        $this->RegisterMessage(0, KL_SUCCESS);
        $this->RegisterMessage(0, KL_NOTIFY);
        $this->RegisterMessage(0, KL_WARNING);
        $this->RegisterMessage(0, KL_ERROR);
        $this->RegisterMessage(0, KL_DEBUG);
        $this->RegisterMessage(0, KL_CUSTOM);
    }
...
    public function MessageSink($TimeStamp, $SenderID, $Message, $Data)
    {
        $this->SendDebug(__FUNCTION__, 'Message from SenderID ' . $SenderID.' with Message ' . $Message, 0);
    }

Ich hätte nun erwartet, das ich allen Meldungen bekommen; leider ist im Modul-Debug gar nichts zu sehen…

Als Instanz habe ich 0 gewählt, weil ich davon ausgehe, das die Log-Messages an das System an sich gehen. Und da ist glaube ich der gedankliche Fehler: man muss ja die SenderID angeben und eine Log-Messages geht ja nicht von Kernel aus sondern eher zum Kernel hin …
Ich bin mir auch nicht sicher, ob eine Log-Message überhaupt eine Message in diesem Sinne ist.

Mir fehlt im Augenblick die Idee, ob/wie man den Wunsch umsetzen kann, alle Log-Messages „abzufangen“ und an den Syslog weiterzuleiten

gruß
demel

Da hast du Recht, 0 ist bestimmt zu einfach.
Vielleicht muss man es in einer Schleife über alle Instanzen machen.

Ob das aber für alle Meldungen reicht?

Vielleicht hat ein Fachmann da den entscheidenden Hinweis? [emoji1]

Alternativ den Snapshot holen und dort alle KL_ Nachrichten rausfiltern.

Michael

im Snapshot sind Nachrichten enthalten? Ich habe extra nochmal nachgeschaut. Ich finde darin nur Sen Inhalt von settings,json (objects, profiles, options) sowie ein paar andere Daten (timestamp, timezone, compatibility).

Gibt es da weitere Optionen`?

Gruß
demel

Ich habe mal spasseshalber auf ein paar Variablen ein RegisterMessages() gemacht und aus ein paar Instanzen … und bisher keine Log-Messages entlocken können …

demel

Schau doch Mal wie die WebConsole das macht :slight_smile:
Ohne Nachrichten kann die auch kein Meldungsfenster anzeigen.
Kann es aktuell nicht testen, wollte damit aber auch noch spielen (wenn Zeit).
Michael

Macht es bitte nicht über den MessageSink. Ich hatte auf dem Event jemandem erklärt warum das nicht geht :wink: Ein Modul erzeugt pro Aufruf des MessageSink Meldungen… somit hat man sofort eine saubere Endlosschleife. Aber Michaels Idee mit dem GetSnapshotChanges sollte gut laufen. Das läuft komplett Nebenläufig und sollte nichts blockieren. Und ihr habe alle Nachrichten. Da könnt ihr dann auch ein Modul draus machen :slight_smile:

paresy

Ja, das hatte ich befürchtet.

Ich hatte Nall-chan so verstanden, das er IPS_GetSnapshot() meint … IPS_GetSnapshotChanges() kannte ich nicht.

Probiere ich mal aus.

Gruß
demel

Initial musst du IPS_GetSnapshot auch aufrufen um die letzte ID der Nachricht zu ermitteln.

paresy

So weit, so gut. Es kommen allerdings ein paar Fragen … :smiley:

  1. das array-Element ‚TimeStamp‘ ist kein Unix-Timestamp, korrekt? Ein Bezug zum Start vom IPS sehe ich auch nicht, vielleicht einfach ein Zähler ab Start des IPS?
    … ist aber wahrscheinlich (ausser für den Abruf der nächsten Daten) irrelevant.

  2. steht irgendwo, wie die Nachrichten aufgebaut sind? Wenn nicht, werde ich das mal selbst aufdrösel :wink:

Ich würde zwar nicht alle Nachrichtentypen auswerten, aber ausser den normalen LogMessages fände ich schon einige andere Nachrichten interessant.

danke
demel

Hallo BoyScout,

welche der Nachrichten würdest Du denn gerne sehen?

Die LogMessages (also 10201 … 10207) sind kein Problem.

Gruß
demel

Hallo BoyScout,

ich habe eine erste Test-Version vorbereitet.

gewohnte URL (GitHub - demel42/IPSymconSyslog: Syslog-Client für IP-Symcon), aber bitte in Kern-Instanz -> Modules den Zweig auf logger-test umstellen.

Das Modul überträgt nun alle Messages entsprechend der ausgewählten Nachrichten-Typen zum syslog. Alle Variablenänderungen sind auch Meldungen, sind also enthalten.

Sind natürlich schon eine Menge Nachrichten, ggfs könnten man da auch etwas filtern.

fröhliches Testen

Gruß
demel

Hallo
Gleich mal getestet und bei der Konfiguration kommt gleich eine Warnung:
25.02.2019, 18:14:29 | PHP | Error: Warning: Use of undefined constant LOG_LOCAL0 - assumed ‚LOG_LOCAL0‘ (this will throw an Error in a future version of PHP)
Error in Script C:\Program Files (x86)\IP-SYMCON\modules\IPSymconSyslog\IPSymconSyslog\module.php on Line 151
134 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
37 in scripts\IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
151 in modules\IPSymconSyslog\IPSymconSyslog\module.php (call IPSLogger_PhpErrorHandler)
35 in modules\IPSymconSyslog\IPSymconSyslog\module.php (call decode_facility)
3 in C:\Windows\System32- (call ApplyChanges)

Gesendet von iPad mit Tapatalk