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

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

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.


Newsletter

Trage Dich jetzt in den Newsletter ein und genieße dadurch viele Vorteile:

  • 5€-Gutschein als Dankeschön
  • Zugang zu exklusiven Inhalten
  • Angebote für Produkte

* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir regelmäßig Informationen und Produktempfehlungen aus dem Fachgebiet Smart Home zugesendet werden. Mit dem Eintrag akzeptieren Sie unsere Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.

Auf YouTube und hier im Blog gibt es bereits unzählige kostenlose Videos, Informationen und Tutorials. Wenn Dir das noch nicht reicht, ist ein Training genau das richtige für Dich! Die folgenden Trainings haben den Vorteil, dass immer von Anfang an gestartet wird und Du ohne Vorwissen teilnehmen kannst.