FHEM Tutorial-Reihe - Part 64: Eigene Log-Dateien

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

FHEM Tutorial-Reihe - Part 64: Eigene Log-Dateien
FHEM Tutorial-Reihe - Part 64: Eigene Log-Dateien
  • Matthias Kleine
  • 18.09.2019
  • Hardware
  • Integration

Ich werde oft gefragt, wie man Texte und Meldungen in separate Log-Dateien schreiben kann. Dazu habe ich mir ein bisschen was überlegt, was ich gerne mit Dir teilen möchte. Und zwar nutzen wir eine eigene Funktion mit einem Command-Alias, welcher uns dann eine super einfache Schnittstelle bereitstellt umd Meldungen zu loggen. Das kann sinnvoll sein, wenn man Zeitpunkte protokollieren möchte, welche einfach super selten auftreten. Ich habe damit zum Beispiel meine ganzen HomeMode-Events (siehe auch im FHEM-Kurs) protokolliert. So kann ich genau sehen ob ein Event einfach nicht eingetreten ist, oder ob etwas an der Logik falsch ist. Und wenn ich den Ablauf nachvollziehen möchte, muss ich dafür nur eine einzelne Datei öffnen und habe alle Werte auf einen Blick. Mit der Funktion Log3 aus dem FHEM-Core kann man das zwar auch hinbekommen, aber muss die Meldungen aus einer Masse von anderen Nachrichten erstmal herausfiltern.

Natürlich interessiert mich auch Deine Meinung dazu. Findest Du das praktisch? Oder hast Du für das gleiche Problem eine Alternative Lösung? Schreib es mir gerne in die Kommentare unter dem YouTube-Video.

Was wird benötigt?

  • Eine FHEM-Installation

Video

FHEM-Kurs

Befehle

Diese Funktion brauchen wir um Daten in eigene Log-Dateien schreiben zu können:

sub customLog($$$)
{
    my ($filename, $loglevel, $text) = @_;

    return if ($loglevel > AttrVal('global', 'verbose', 3));

    my ($seconds, $microseconds) = gettimeofday();
    my @t = localtime($seconds);
    my $nfile = ResolveDateWildcards($filename, @t);

    my $tim = sprintf("%04d.%02d.%02d %02d:%02d:%02d", $t[5] + 1900, $t[4] + 1, $t[3], $t[2], $t[1], $t[0]);
    if (AttrVal('global', 'mseclog', 0)) {
        $tim .= sprintf(".%03d", $microseconds / 1000);
    }

    open(my $fh, '>>', $nfile);
    print $fh "$tim $loglevel: $text\n";
    close $fh;

    return undef;
}

Der Aufruf kann dann wie folgt getestet werden:

{ customLog("/opt/fhem/log/ersterTest.log", 3, "Das hat funktioniert") }
{ customLog("./log/ersterTest-%d-%m-%Y.log", 3, "Das hat auch funktioniert") }

Nun ist das aber recht sperrig - mit einem cmdAlias kann man den Aufruf viel einfacher und schöner gestalten:

define cmdCustomLog cmdalias customlog .* AS { customLog("./log/customLog-%m-%Y.log", 3, $EVENT) }

Sobald das Gerät definiert ist, kann mit dem neuen Befehl “customlog” ein Text in das Logfile geschrieben werden. Ja, das Verbose-Level ist nun immer gleich. Das könnte man auch noch als ersten Wert aus dem Aufruf extrahieren und dann als zweiten Parameter an die Funktion übergeben. Aber wir wollen es ja möglichst einfach halten.

customlog hallo
customlog test
customlog Das ist ein ganzer Satz

Diesen Aufruf kann man nun überall in FHEM nutzen. Also in einem DOIF z.B. Und das ganz ohne Perl-Modus. So bleibt der Code sauber. Sollte man die Einträge nicht mehr schreiben wollen, senkt man entweder das globale Verbose-Level oder man ändert die Funktion ab.

Natürlich kann man auch mehrere Alias-Geräte anlegen, wenn man verschiedene Logfiles erstellen möchte.

Ich will mehr

Smart-Home-Training von A-Z

Steig noch tiefer in die Themen ein und meistere Deine Projekte!

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
Hausbau-Kurs

Hausbau-Kurs

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
NodeRed-Kurs

NodeRed-Kurs

Mehr Infos