[neu] 92_rsyslog.pm - Loggen in das syslog

Begonnen von betateilchen, 26 Mai 2016, 13:46:54

Vorheriges Thema - Nächstes Thema

betateilchen

Unter ./contrib/ befindet sich seit einiger Zeit das Modul 92_rsyslog.pm. Mit diesem Modul ist es möglich, Logausgaben von fhem direkt in das syslog (auch remote syslog) zu schreiben.

Voraussetzungen:


  • das Modul muss aus ./contrib nach ./FHEM gebracht werden, entweder als Kopie oder als symlink.
  • das Modul benötigt das zusätzliche perl-Modul Sys::Syslog Dieses kann auf Debian Systemen mit "apt-get install libsys-syslog-perl" installiert werden.

Anwendung:

generelle Syntax:

define <name> rsyslog <ident> <logopt> <facility> <regexp>

Eine ausführliche Beschreibung der Parameter ident, logopt, facility findet man in perldoc

Beispiel, um einfach alles zu loggen:

define my_syslog rsyslog fhem ndelay local0 .*

erzeugt eine Ausgabe nach folgendem Beispiel:


tail -f /var/log/syslog |grep fhem:

May 26 13:27:16 fhem-demo fhem: global: DEFINED rsyslog
May 26 13:27:17 fhem-demo fhem: global: SAVE
May 26 13:27:56 fhem-demo fhem: global: SHUTDOWN
May 26 13:27:59 fhem-demo fhem: global: INITIALIZED
May 26 13:28:00 fhem-demo fhem: at_heartbeat: Next: 13:29:00
May 26 13:28:53 fhem-demo fhem: global: ATTR rsyslog room 98 LogFiles
May 26 13:28:56 fhem-demo fhem: global: SAVE
May 26 13:29:00 fhem-demo fhem: at_heartbeat: Next: 13:30:00


Das Modul besitzt eine Dokumentation als commandref. Mit "help rsyslog" lässt sich die Hilfe aufrufen, sobald das Modul nach ./FHEM gebracht wurde.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Mitch

könnte man damit auch auf einen externen Syslog Server loggen?
FHEM im Proxmox Container

betateilchen

natürlich, aber das wird nicht in fhem konfiguriert, sondern in rsyslog (auf Betriebssystemebene) selbst.

http://www.rsyslog.com/doc/master/index.html
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Mitch

Danke, hat geklappt, Logmeldungen kommen beim Syslogserver an.

Jetzt wäre es noch super, wenn ich quasi den kompletten FHEM Log weiter leiten könnte und dafür das Logfile "abschalten"
FHEM im Proxmox Container

betateilchen

Zitat von: Mitch am 09 Januar 2017, 18:04:13
Jetzt wäre es noch super, wenn ich quasi den kompletten FHEM Log weiter leiten könnte und dafür das Logfile "abschalten"

Und wo ist das Problem?


attr global logfile -


und dann die fhem-Ausgaben von stdout und stderr ins syslog schicken mit


perl fhem.pl configDB |& logger &


Ein Blick in das Manual von logger lohnt sich. Da steht auch, wie man externe syslog-Server füttern kann.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DS_Starter

#5
Hallo Udo,

jetzt bin ich auf der Suche nach einem eventuell schon existierenden Modul eines Syslog-Client über dein 92_rsyslog.pm im contrib gestolpert.
Da ich mir einen Splunk-Server in einer VM aufgebaut habe, sollte ein externer Syslog-Server angesprochen werden.
Ich wollte diese Möglichkeit in dem Modul abbilden und habe dafür dein Modul ein wenig erweitert sodass man über die Attribute "host"," port"," type" die Kommunikationsdaten auswählen kann.

Funktioniert bei mir einwandfrei zum Beispiel mit der folgenden Def:


defmod splunklog rsyslog fhemtest ndelay,nonul syslog .*
attr rsl addStateEvent 1
attr rsl host splunk.myds.me
attr rsl port 514
attr rsl room Testraum
attr rsl rsl_timestamp 0
attr rsl type UDP


Ich konnte nicht testen ob es mit einem lokalen syslog-Server noch funktioniert, aber ich gehe davon aus.
Die Hilfe ist ebenfalls angepasst.
Wenn du magst und die Erweiterung für gut befindest, kann es gerne in das contrib übernommen werden.

viele Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

DS_Starter

Hallo Udo,

angeregt durch deine 92_rsyslog habe ich ein kleines Modul 93_Log2Syslog erstellt, welches Einträge für das FHEM Systemlog ebenfalls
an einen Syslog-Server weiterleitet ohne dass man auf Betriebssystemebene Einstellungen vornehmen muss.

Damit das Ganze funktioniert, muss ich Rudi allerdings noch bitten in die sub "Log3" in fhem.pl
diese kleine Abfrage (oder ähnlich) einzubauen, falls er nichts dagegen einzuwenden hat:

sub
Log3($$$)
{
  my ($dev, $loglevel, $text) = @_;

  .....

  if($logopened) {
    print LOG "$tim $loglevel: $text\n";
  } else {
    print "$tim $loglevel: $text\n";
  }

  ##########  Log2Syslog ########
  my @ldvs = devspec2array('TYPE=Log2Syslog');
  if(int(@ldvs) == 1) {
    my $ln = shift(@ldvs);
    CallInstanceFn($ln, "Fhem2SyslogFn", $tim, $loglevel, $text);
  }
  ##########
  ......



Meine eigentliche Frage ist, ob du etwas dagegen einzuwenden hättest wenn ich das Modul 93_Log2Syslog mit deinem Code aus 92_rsyslog ergänze ?
(Du wirst es ja nicht ohne Grund im contrib liegen haben.)

In dem Fall wäre der Nutzer in der Lage, wahlweise über ein Attribut entweder die Events oder die FHEM Systemlogeinträge (bzw. beides) an einen
Syslog-Server weiterzuleiten.
Die Handhabung der Einstellungen wären, so wie man es gewohnt ist, einfach über das FHEM-Modul zu realisieren.

Das 93_Log2Syslog Modul stelle ich zu gegebener Zeit im Forum zum Test zur Verfügung. Es macht allerdings erst und nur Sinn wenn Rudi
diesen kleinen Zusatz einbauen würde.

viele Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

rudolfkoenig

ZitatDamit das Ganze funktioniert, muss ich Rudi allerdings noch bitten in die sub "Log3" in fhem.pl
Einen Hook fuer Log3 gibts schon, siehe Log3 weiter unten, Stichwort logInform, bzw. notify readLog Attribut Implementation.

Btw.: devspec2array waere in diesem Fall zu teuer, ich habe selbst bei der Schleife ueber logInform ein schlechtes Gewissen.

DS_Starter

Hallo Rudi,

ZitatEinen Hook fuer Log3 gibts schon, siehe Log3 weiter unten, Stichwort logInform, bzw. notify readLog Attribut Implementation.

Ahh ... das ist klasse. Dann baue ich das kleine Modul mal so um damit ich diese Schnittstelle nutzen kann. Das notify readLog Attribut
kannte ich natürlich, habe aber mit keiner Silbe daran gedacht. Danke für den Hinweis !

viele Grüße und ein schönes WE,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

betateilchen

Zitat von: DS_Starter am 12 August 2017, 10:45:54
Meine eigentliche Frage ist, ob du etwas dagegen einzuwenden hättest wenn ich das Modul 93_Log2Syslog mit deinem Code aus 92_rsyslog ergänze ?

Du kannst gerne beide Module zusammenführen oder den maintainer für beide Module übernehmen. Dazu habe ich das Modul aus ./contrib/betateilchen nach ./contrib verschoben und die MAINTAINER.txt entsprechend ergänzt (Du müsstest noch die gewünschte Forumrubrik eintragen, in der Du das supporten willst)

Für mich war 92_rsyslog.pm damals eigentlich nur ein proof-of-concept.

Zitat von: DS_Starter am 12 August 2017, 10:45:54
(Du wirst es ja nicht ohne Grund im contrib liegen haben.)

Der Supportumfang (die Beantwortung der Anwenderfragen, die sich mit rsyslog auf Betriebssystemebene nicht auskennen) ist einfach zu hoch, das kann ich nicht zeitnah leisten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DS_Starter

Danke Udo für die schnelle Antwort und die Vorbereitungen !

Setze es dann mal um, auch in Bezug von Rudis Hinweis, und stelle das Modul hier in "Automatisierung" zum Usertest zur Verfügung.

Dir auch ein schönes WE,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Paul Guijt

Hallo Heiko,

Würde es möglich, in rsyslog ein zu bauen das ein Event nicht nach rsyslog geht wenn er
1. schon nach DbLog geht
2. schon nach ein FileLog geht?
Vielleicht optional zu machen mit ein attr in der Rsyslog Modül und/oder in der Modul das der Event anliefert?

Das letzte wie
- was sagt das attr Rsyslog des sendende Modüls?
- stimmt das Event mit der attr?

Sonst muß man ein filter einbauen in rsyslog.conf oder ein complizierte Regexp machen.

Grüß,
Paul
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

DS_Starter

Hallo Paul,

ich habe jetzt eine ganze Weile über diese Aufgabenstellung nachgedacht, konnte aber bisher keinen Lösungsweg erkennen der problemlos innerhalb der Module umsetzbar wäre.
Ich schlafe aber nochmal darüber.

Grüße,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Paul Guijt

Hallo Heiko,

Was hältst du davon, in rsyslog.pm eine ähnliche Technik wie DbLogInclude einzufügen?

In _Initialize: addToAttrList("DbLogInclude");

In _Log:   my $DbLogInclude       = AttrVal($dev_name, "DbLogInclude",undef);

if($DbLogInclude && ($DbLogSelectionMode =~ m/Include/)) {
my @v1 = split(/,/, $DbLogInclude);
             
for (my $i=0; $i<int(@v1); $i++) {
my @v2 = split(/:/, $v1[$i]);
$DoIt = 1 if($reading =~ m,^$v2[0]$,); #Reading matcht auf Regexp
if(($v2[1] && $reading =~ m,^$v2[0]$,) && ($v2[1] =~ m/^(\d+)$/)) {
#Regexp matcht und MinIntervall ist angegeben
my $lt = $defs{$dev_hash->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME};
my $lv = $defs{$dev_hash->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE};
$lt    = 0  if(!$lt);
$lv    = "" if(!defined $lv);                   # Forum: #100344
$force = ($v2[2] && $v2[2] =~ /force/i)?1:0;    # Forum: #97148
if(($now-$lt < $v2[1]) && ($lv eq $value || $force)) {
# innerhalb MinIntervall und LastValue=Value
$DoIt = 0;
} } } }


Später kann dan eventuell auch ein DbLogValueFn übernommen werden.

Freundliche Grüß,
Paul
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

DS_Starter

Hallo Paul,

prinzipiell wäre es zwar möglich, aber dein Ziel welches du definiert hattest, wird dadurch nicht erreicht. So ist allein schon bei FileLog eine solche Logik nicht vorhanden. Die gibt es z.Zt. nur in DbLog. Außerdem könnstest du nur entscheiden, ob ein Reading über dieses Logik in rsyslog verarbeitet werden soll oder nicht. Eine Abhängigkeit der Verarbeitung vom Status in anderen Modulen, d.h. ob der Event bereits zB. in Filelog geloggt wurde, ist dadurch auch nicht gegeben.

Eine weitere Problematik ist die Reihenfolge der Eventverarbeitung. Man kann programmtechnisch zwar die Reihenfolge beeinflussen, aber sie ist trotzdem gegenüber anderen Modulen festgelegt. Welches Modul ... DbLog, FileLog, rsyslog, Log2Syslog und eventuell noch weitere, soll denn das erste, zweite, dritte.... sein ?
Denn nur das in der Reihe folgende Module kann evtl. auf den Status des vorherigen reagieren. Was ist, wenn der Nutzer eine andere Reihenfolge der Abhängigkeiten wünscht ?

Viele Fragen also die berücksichtigt werden müssten !

Für rsyslog könnte ich mir momentan nur eine  rsysLogValueFn vorstellen, mit der du wie bei DbLogValueFn mit eigenem Code entscheiden kannst, ob ein Event geloggt werden soll oder nicht, ggf. über einen Dummy und eigener Logik in der  DbLogValueFn eine Verarbeitungschain aufbaust. FileLog ist da, wie bereits dargestellt, ohnehin außen vor.

Nebenbei, rsyslog ist kein offizielles Modul. Ich hatte seinerzeit auf der Idee von rsyslog basierend das Modul 93_Log2SysLog erstellt welches auch aktiv weiterentwickelt wird. Wenn es für deinen Einsatzfall in Frage kommt, schau dir mal 93_Log2SysLog an. Ansonsten könnte ich eine rsysLogValueFn probehalber in 92_rsyslog implementieren.

liebe Grüße,
Heiko

ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter