Systemprotokoll auf Syslog Server

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

GoPro
Beiträge: 25
Registriert: 24.09.2017, 14:20

Systemprotokoll auf Syslog Server

Beitrag von GoPro » 19.09.2022, 00:23

Hallo Liebes Forum,

kann ich das Systemprotokoll (Auf der Weboberfläche unter "Status und Bedienung" -> "Systemprotokoll" irgendwie an einen Syslog oder mySQL Senden oder mit per FTP runter laden?

danke und lg
Jogi

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Systemprotokoll auf Syslog Server

Beitrag von jp112sdl » 19.09.2022, 06:22

GoPro hat geschrieben:
19.09.2022, 00:23
"Systemprotokoll" irgendwie an einen Syslog
Ja das geht.
Ich mache das mit einem Script, das ich alle 10min. laufen lassen. Häufiger brauche ich es zumindest nicht.

Es muss noch eine Systemvariable (Zahl) namens "LastHistoryTimestamp" angelegt werden.
Darin wird die Zeit der letzten Übertragung abgelegt, als Startpunkt für die nächste, damit bereits übertragene Einträge nicht noch mal gesendet werden.

Code: Alles auswählen

integer cnt = dom.GetHistoryDataCount();
string s;
integer rCount;
object objLastHistoryTimestamp=dom.GetObject(ID_SYSTEM_VARIABLES).Get("LastHistoryTimestamp");
integer iLastHistoryTimestamp=objLastHistoryTimestamp.Value();
string sHistoryTs;

!WriteLine("iLastHistoryTimestamp="#iLastHistoryTimestamp.ToString(0));
WriteLine("Logeinträge: "#cnt);
foreach( s, dom.GetHistoryData(0,cnt, &rCount ) ){
  string sDatapointId = s.StrValueByIndex(";",1);
  string sRecordedValue = s.StrValueByIndex(";",2);
  string sDateTime = s.StrValueByIndex(";",3);
  string stmpDate = sDateTime.StrValueByIndex(" ",0);
  string stmpTime = sDateTime.StrValueByIndex(" ",1);
  
  system.Exec("date +%s -d \""#stmpDate#" "#stmpTime#"\"",&sHistoryTs);
  integer iHistoryTs=sHistoryTs.ToInteger();
  
  if (iLastHistoryTimestamp < iHistoryTs) {
    string sDatapointName = "";
    object oHistDP = dom.GetObject( sDatapointId );
    if( oHistDP ) {
      object oDP = dom.GetObject( oHistDP.ArchiveDP() );
      if( oDP ) {
        sDatapointName = oDP.Name();
        boolean bSysVar = (oDP.IsTypeOf(OT_VARDP) || oDP.IsTypeOf(OT_ALARMDP));
        if( !bSysVar ) {
          object oCH = dom.GetObject( oDP.Channel() );
          if( oCH ) {
            sDatapointName = oCH.Name();
          }            
         }
      }
    }
    string logLine=iHistoryTs.ToString(0)#","#sDatapointName#","#sDatapointId#","#sRecordedValue;
    WriteLine(logLine);
    system.Exec("logger -p info -t 'RegaSysProto' '"#logLine#"'");
  }
  objLastHistoryTimestamp.State(iHistoryTs);
}

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

Re: Systemprotokoll auf Syslog Server

Beitrag von NickHM » 19.09.2022, 08:36

Hallo

Frage zu dem Script ..
An welcher Stelle werden die Daten jetzt WOHIN? übertragen?

Ich habe versucht das Script nachzuvollziehen, verstehe aber nicht, was da passiert :(

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Systemprotokoll auf Syslog Server

Beitrag von jp112sdl » 19.09.2022, 08:43

Die Daten werden an den "logger" übergeben.

Der schreibt nach /var/log/messages und - sofern konfiguriert (Einstellungen->Systemsteuerung->Zentralenwartung) - an den Syslogserver

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

schneider.obw
Beiträge: 69
Registriert: 30.09.2014, 23:02
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 17 Mal
Danksagung erhalten: 10 Mal

Re: Systemprotokoll auf Syslog Server

Beitrag von schneider.obw » 19.09.2022, 08:52

Hallo Jérôme.

Dein Script würde ich auch gerne in ähnlicher Applikation wie mein Vorgänger einsetzen.
Meine Script-Kenntnisse sind jedoch nur sehr rudimentär, und ich passe vorgegebene Scripts meist nur marginal an meine Umgebung an.

Kannst du mir bei deinem Script noch zeigen, mit welchem Befehl du unter welchem Dateinamen in welches Filesystem die gesammelten Daten des Systemprotokolls wegschreibst.
Ich vermu mal, du schreibst in eine Datei auf tmp weg?
Oder geht das an einen konfigurierten Syslog-Server im Netzwerk?

Meine Anwendung dafür wäre in eine Zieldatei auf einem gemounteteten Laufwerk meines NAS.
Idealerweise immer angehangen, und zum Abschlussdes Tages mit Datum im Namen weggesichert.

Vielleicht hast du da noch einen Tipp für mich.
Das Mounnten des Laufwerks zum NAS bekomme ich im Script selbst noch hin.

Danke vorab.
Zuletzt geändert von schneider.obw am 19.09.2022, 15:19, insgesamt 1-mal geändert.

schneider.obw
Beiträge: 69
Registriert: 30.09.2014, 23:02
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 17 Mal
Danksagung erhalten: 10 Mal

Re: Systemprotokoll auf Syslog Server

Beitrag von schneider.obw » 19.09.2022, 08:54

Meine AW hat sich wohl um wenige Sekunden überkreuzt. Sorry dafür.
Ist somit beantwortet.

Das bedeutet aber auch, dass sich die Einträge aus dem Sysprotokoll hier mit den geloggten Einträgen des Fehlerprotokolls vermischen(?).

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Systemprotokoll auf Syslog Server

Beitrag von jp112sdl » 19.09.2022, 09:08

schneider.obw hat geschrieben:
19.09.2022, 08:52
mit welchem Befehl

Code: Alles auswählen

system.Exec("logger -p info -t 'RegaSysProto' '"#logLine#"'");
schneider.obw hat geschrieben:
19.09.2022, 08:54
Das bedeutet aber auch, dass sich die Einträge aus dem Sysprotokoll hier mit den geloggten Einträgen des Fehlerprotokolls vermischen(?).
Ja, das ist aber kein Problem, weil man sie gezielt filtern kann (Tag "RegaSysProto")

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

schneider.obw
Beiträge: 69
Registriert: 30.09.2014, 23:02
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 17 Mal
Danksagung erhalten: 10 Mal

Re: Systemprotokoll auf Syslog Server

Beitrag von schneider.obw » 19.09.2022, 09:24

Ja. Ok und Danke.
Die Filterfunktion ist natürlich auch eine gute Möglichkeit.
Dann braucht es keinen zusätzlichen Syslogserver und das Gefummel mit Datum und Dateinamen (und auch kein gemountetes Volume).

Der Syslog-Server rennt ja zuverlässig und ist komfortabel für die Auswertungen.
Warum kompliziert, wenn es auch einfach geht. Ich setz das dann mal mit deinem Script so um.

Hättest Du ggfs. auch noch ein Kommando für das Script, um nach getaner Kopieraktion das Systemprotokoll in der CCU(3) zu löschen.

Danke und noch einen schönen Tag.

schneider.obw
Zuletzt geändert von schneider.obw am 19.09.2022, 15:19, insgesamt 1-mal geändert.

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Systemprotokoll auf Syslog Server

Beitrag von jp112sdl » 19.09.2022, 10:45

schneider.obw hat geschrieben:
19.09.2022, 09:24
um nach getaner Kopieraktion das Systemprotokoll in der CCU(3) zu löschen.

Code: Alles auswählen

dom.ClearHistoryData();
Dann brauchst du auch das mit der LastHistoryTimestamp-Sysvar nicht.

Ungetestet:

Code: Alles auswählen

integer cnt = dom.GetHistoryDataCount();
string s;
integer rCount;
string sHistoryTs;

foreach( s, dom.GetHistoryData(0,cnt, &rCount ) ){
  string sDatapointId = s.StrValueByIndex(";",1);
  string sRecordedValue = s.StrValueByIndex(";",2);
  string sDateTime = s.StrValueByIndex(";",3);
  string stmpDate = sDateTime.StrValueByIndex(" ",0);
  string stmpTime = sDateTime.StrValueByIndex(" ",1);
  
  system.Exec("date +%s -d \""#stmpDate#" "#stmpTime#"\"",&sHistoryTs);
  integer iHistoryTs=sHistoryTs.ToInteger();
  
  string sDatapointName = "";
  object oHistDP = dom.GetObject( sDatapointId );
  if( oHistDP ) {
    object oDP = dom.GetObject( oHistDP.ArchiveDP() );
    if( oDP ) {
      sDatapointName = oDP.Name();
      boolean bSysVar = (oDP.IsTypeOf(OT_VARDP) || oDP.IsTypeOf(OT_ALARMDP));
      if( !bSysVar ) {
        object oCH = dom.GetObject( oDP.Channel() );
        if( oCH ) {
          sDatapointName = oCH.Name();
        }            
       }
    }
  }
  string logLine=iHistoryTs.ToString(0)#","#sDatapointName#","#sDatapointId#","#sRecordedValue;
  WriteLine(logLine);
  system.Exec("logger -p info -t 'RegaSysProto' '"#logLine#"'");
}
dom.ClearHistoryData();

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

schneider.obw
Beiträge: 69
Registriert: 30.09.2014, 23:02
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 17 Mal
Danksagung erhalten: 10 Mal

Re: Systemprotokoll auf Syslog Server

Beitrag von schneider.obw » 19.09.2022, 15:18

Perfekt.
Herzlichen Dank für deine Hilfestellungen hier.

MfG
schneider.obw

Antworten

Zurück zu „HomeMatic allgemein“