Project

General

Profile

Bug #7906

Il est trop difficile d'activer les logs de DEBUG avec debian_config_common.py

Added by Benjamin Dauvergne over 4 years ago. Updated over 4 years ago.

Status:
Fermé
Priority:
Haut
Category:
-
Target version:
-
Start date:
22 Jul 2015
Due date:
% Done:

100%

Patch proposed:
Yes
Planning:
No

0001-add-a-custom-logger-class-to-make-log-level-dynamic-.patch View (3.63 KB) Benjamin Dauvergne, 22 Jul 2015 05:26 PM

0001-add-a-custom-logger-class-to-make-log-level-dynamic-.patch View (3.76 KB) Benjamin Dauvergne, 24 Jul 2015 03:17 PM

Associated revisions

Revision 0e9f7b72 (diff)
Added by Benjamin Dauvergne over 4 years ago

monkeypatch Logger.getEffectiveLevel to get dynamic log levels (fixes #7906)

A new class deriving from int is made to replace loglevels, it's used to
mark a log level which should change based upon a boolean Django
setting, which defaults to 'DEBUG'. In the override of
Logger.getEffectiveLevel() if the level found is such a class, the
corresponding setting is checked and if it is True, the DEBUG level is
returned.

History

#1 Updated by Benjamin Dauvergne over 4 years ago

Je vais adopter le même système dans authentic2 mono-tenant.

#2 Updated by Frédéric Péters over 4 years ago

Tu pourrais décrire un peu l'usage en pratique de cette proposition ? (ce qui pourra ensuite alimenter la page HowDoWeDoLogging)

#3 Updated by Benjamin Dauvergne over 4 years ago

Et bien on met DEBUG = True dans ses settings et tous les logger avec un niveau de log défini à DebugLogLevel('xxx') deviennent un niveau 'DEBUG'. On peut aussi dépendre d'un autre setting que DEBUG en passant un paramètre django_setting='DEBUG_XXX' au constructeur.

Ça a l'avantage d'être dynamique: si on change DEBUG depuis une vue, ça activera les logs de debug sans redémarrer l'application, et coté multitenant on pourra activer le DEBUG dans un tenant et pas un autre.

#4 Updated by Frédéric Péters over 4 years ago

En fait,

  • hobo.logger.DebugLogLevel('INFO') signifie "INFO en temps normal mais DEBUG si DEBUG = True".
  • hobo.logger.DebugLogLevel('INFO', django_settings='FOOBAR') signifie "INFO en temps normal mais DEBUG si FOOBAR = True".

Je trouve DebugLogLevel pas très clair pour moi; à prendre l'idée et la généraliser sur un libellé qui m'est plus compréhensible,

  • SettingsLogLevel('INFO'), signifierait "INFO en temps normal mais DEBUG si DEBUG = True".
  • SettingsLogLevel('INFO', override='FOOBAR'), signifierait "INFO en temps normal, mais le niveau spécifié dans FOOBAR s'il est défini" (avec True → DEBUG).

Ça te parle un peu ?

#5 Updated by Benjamin Dauvergne over 4 years ago

Je trouve un peu compliqué le si FOOBAR est string alors FOOBAR sinon si FOOBAR est True alors "DEBUG". En fait je ne vois pas le besoin de mettre autre chose que DEBUG ou INFO, les librairies qui log des trucs inutiles au niveau INFO sont à corriger (genre django-select2) et en attendant à bloquer tout simplement comme je le fais dans authentic pour django-select2.

Donc j'irai plus vers un SettingsLogLevel(debug_setting='DEBUG', default='INFO') qui n'accepte que des variable de settings à True ou False et dans ce cas mette le niveau à DEBUG; donc quasiment l'implémentation actuelle mais en renommant la classe et les paramètres. On pourrait imaginer avoir un error_setting, warning_setting en prenant le niveau le plus bas entre ceux activés et default. Je n'en vois pas le besoin actuellement.

#6 Updated by Frédéric Péters over 4 years ago

Ok, ça me va de juste modifié les noms, ça rend les choses plus claires pour moi.

#7 Updated by Benjamin Dauvergne over 4 years ago

#8 Updated by Benjamin Dauvergne over 4 years ago

  • Priority changed from Normal to Haut

Je veux bien qu'on me ack ce ticket, c'est vraiment difficile de débugger les plateformes multitenant sans ça.

#9 Updated by Frédéric Péters over 4 years ago

Les modifs à manage.py et hobo/wsgi.py, c'était pour plus facilement tester chez toi, sans passer par le paquet .deb ? (il me semble)

Sans ça, je dirais ok.

#10 Updated by Benjamin Dauvergne over 4 years ago

Il faut absolument que setLoggerClass() soit appelé avant toute utilisation de logging.getLogger(), c'est pour cela que je fais l'import dans wsgi.py et manage.py.

#11 Updated by Frédéric Péters over 4 years ago

Mais, le import hobo.logger au début du debian_config_common.py, il fait ça, non ? (pour toutes les applications, alors que modifier manage.py et wsgi.py concerne seulement hobo).

#12 Updated by Benjamin Dauvergne over 4 years ago

Le problème c'est que Django fait des getLogger() (et gunicorn aussi mais là j'ai abandonné et eux aussi, ils ne gèreront plus les logs à l'avenir, ->stderr ) avant de charger la configuration.

#13 Updated by Frédéric Péters over 4 years ago

Et donc les manage.py et wsgi.py de toutes les applis doivent être modifiés, ok, <soupir/>.

#14 Updated by Benjamin Dauvergne over 4 years ago

On peut aussi essayer de partager un manager/wsgi.py à partir d'hobo, la seule ligne qui change c'est:

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hobo.settings")

C'est déjà un peu nul.

#15 Updated by Benjamin Dauvergne over 4 years ago

  • % Done changed from 0 to 100
  • Status changed from Nouveau to Résolu (à déployer)

#16 Updated by Benjamin Dauvergne over 4 years ago

  • Status changed from Résolu (à déployer) to Fermé

Also available in: Atom PDF