Verbose Level auf die Device Ebene einschränken

Begonnen von marc2, 20 Juli 2013, 00:38:59

Vorheriges Thema - Nächstes Thema

ntruchsess

Genau so verhalten sich meine Module beim loggen. Man kann mit dem Loglevel entweder das logging komplett unterbinden, oder aber (ausnahmslos) alles loggen (und das ist dann meistens eher mehr als man sehen will). Wenn man nur für eine einzelne Modulinstanz einstellen möchte, dass etwas mehr (aber eben nicht alles) geloggt wird, dann geht das halt so nicht. Ich dachte halt, ich übersehe da was und frage erst mal nach...

Ich kann ja mal eine entsprechende Logfunktion implementieren mit der man das genauer steuern kann und hier vorstellen, dann hätten alle was davon...

Gruß,

Norbert
while (!asleep()) {sheep++};

ntruchsess

Hier auf Github habe ich mal abgelegt, wie ich mir das vorstelle. Rudolf, Was hälst Du davon?

Gruß,

Norbert
while (!asleep()) {sheep++};

rudolfkoenig

Viel, ich habe es als Log3 (wg. den 3 Parametern) uebernommen, und es in fhem.pl/00_CUL.pm/DevIo.pm/10_FS20.pm eingebaut. Falls keine Groesseren Widerstaende folgen, dann werde ich es in allen von mir gepflegten Modulen uebernehmen.

Folgendes sollte einem bewusst sein:
Fuer Module die schon Log3 nutzen gilt: das vom Benutzer gesetzte loglevel Attribut muss (analog zu verbose) auf einem grossen Wert (> 4) gesetzt sein, damit man debugausgaben sieht.
Fuer Module die noch GetLogLevel verwenden, muss dieses Attribut auf kleine Werte (< verbose) gesetzt sein.

Das ist zwar doof, habe aber keine Idee, wie man es besser machen koennte.


Falls jemanden etwas auffaellt, bitte melden.

betateilchen

Zitat von: rudolfkoenig schrieb am Sa, 10 August 2013 10:47Falls jemanden etwas auffaellt, bitte melden.

*meld*

Ich habe Log3 in 55_GDS eingebaut,

Log3($name, 3, "GDS $name: Decoding CAP record #".$datensatz);

dabei ist mir aufgefallen, dass nun ein Attribut loglevel im device vorhanden sein MUSS, damit etwas geloggt wird. Vorher mit GetLogLevel und dem defaultwert war das irgendwie flexibler, da ging das auch ohne vorhandenes Attribut.

Vielleicht habe ich aber auch noch irgendetwas falsch verstanden?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Falls Attribut vorhanden ist, dann wird es beruecksichtigt, sonst verhaelt sich die Funktion wie das alte Log. Den Unterschied zum loggen mit GetLogLevel habe ich weiter oben erlaeutert, was anderes gibt es nicht.

Ich lass mich aber mit konkreten Beispielen ueberzeugen.

betateilchen

Zitat von: rudolfkoenig schrieb am Sa, 10 August 2013 14:23Ich lass mich aber mit konkreten Beispielen ueberzeugen.

Ich kapier einfach die Logik nicht.

In meinem Coding steht testweise:


my $llevel = GetLogLevel($name,3);
Log 1, "GetLogLevel liefert: $llevel";
Log $llevel, "(GLL) GDS $name: retrieving $dir".$dwd." from DWD server";
Log3($name, 3, "(Log3)GDS $name: retrieving $dir".$dwd." from DWD server");


Fall 1: gds hat kein Attribut loglevel:


2013.08.10 15:07:28 1: GetLogLevel liefert: 3
2013.08.10 15:07:28 3: (GLL) GDS gds: retrieving gds/specials/observations/tables/germany/* from DWD server
2013.08.10 15:07:28 3: (Log3)GDS gds: retrieving gds/specials/observations/tables/germany/* from DWD server


Fall 2: gds hat Attribut loglevel = 3


2013.08.10 15:08:19 1: GetLogLevel liefert: 3
2013.08.10 15:08:19 3: (GLL) GDS gds: retrieving gds/specials/observations/tables/germany/* from DWD server
2013.08.10 15:08:19 3: (Log3)GDS gds: retrieving gds/specials/observations/tables/germany/* from DWD server


Fall 3: gds hat Attribut loglevel = 2


2013.08.10 15:09:10 1: GetLogLevel liefert: 2
2013.08.10 15:09:10 2: (GLL) GDS gds: retrieving gds/specials/observations/tables/germany/* from DWD server


Fall 4: gds hat Attribut loglevel 4


2013.08.10 15:10:09 1: GetLogLevel liefert: 4
2013.08.10 15:10:09 3: (Log3)GDS gds: retrieving gds/specials/observations/tables/germany/* from DWD server

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

> Ich kapier einfach die Logik nicht.

Vermutlich hast Du meine Bemerkung ("Folgendes sollte einem bewusst sein:") nicht gelesen.

betateilchen

doch hab ich. Die Logik ist genau umgekehrt wie vorher. Hilft mir trotzdem nicht weiter. Naja, ich werde einfach mal drüber schlafen, vielleicht kommt mir eine Eingebung.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ntruchsess

die logik ist nur auf den ersten Blick umgekehrt, man muss aufs Detail schauen:

- Bisher musste bei gesetztem loglevel-attribut selbiges kleiner als verbose sein, damit etwas geloggt wurde, der vom Modulentwickler an dieser Stelle vorgesehene Loglevel wurde dann ignoriert und durch den Wert des Loglevel-attributs ersetzt.

- Im Log3 wird bei gesetztem Loglevel-attribute der als Aufrufparameter übergebene Wert mit dem loglevel-attribut verglichen, dafür wird verbose ignoriert. Im Log erscheint als loglevel der vom Modulautor an dieser Stelle vorgesehene Wert.

- bei nicht gesetztem Loglevel-attribute ist das Verhalten gleich.

Gruß,

Norbert
while (!asleep()) {sheep++};