Review logging
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
739c7e7dc0
commit
333fa33135
|
@ -1,6 +1,16 @@
|
||||||
== Logging
|
== Logging
|
||||||
|
|
||||||
Si on veut propager les logs entre applications, il faut bien spécifier l'attribut `propagate`, sans quoi on s'arrêtera au module sans prendre en considération les sous-modules.
|
La configuration des _loggers_ est relativement simple, un peu plus complexe si nous nous penchons dessus, et franchement complète si nous creusons encore.
|
||||||
|
Il est ainsi possible de définir des formattages, gestionnaires (_handlers_) et loggers distincts, en fonction de nos applications.
|
||||||
|
|
||||||
|
Sauf que comme nous l'avons vu avec les 12 facteurs, nous devons traiter les informations de notre application comme un flux d'évènements.
|
||||||
|
Il n'est donc pas réellement nécessaire de chipoter la configuration, puisque la seule classe qui va réellement nous intéresser concerne les `StreamHandler`.
|
||||||
|
La configuration que nous allons utiliser est celle-ci:
|
||||||
|
|
||||||
|
. Formattage: à définir - mais la variante suivante est complète, lisible et pratique: `{levelname} {asctime} {module} {process:d} {thread:d} {message}`
|
||||||
|
. Handler: juste un, qui définit un `StreamHandler`
|
||||||
|
. Logger: pour celui-ci, nous avons besoin d'un niveau (`level`) et de savoir s'il faut propager les informations vers les sous-paquets, auquel cas il nous suffira de fixer la valeur de `propagate` à `True`.
|
||||||
|
|
||||||
|
|
||||||
[source,python]
|
[source,python]
|
||||||
----
|
----
|
||||||
|
@ -10,60 +20,37 @@ LOGGING = {
|
||||||
'formatters': {
|
'formatters': {
|
||||||
'verbose': {
|
'verbose': {
|
||||||
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
|
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
|
||||||
'style': '{',
|
|
||||||
},
|
},
|
||||||
'simple': {
|
'simple': {
|
||||||
'format': '{levelname} {asctime} {module} {message}',
|
'format': '{levelname} {asctime} {module} {message}',
|
||||||
'style': '{',
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'handlers': {
|
'handlers': {
|
||||||
'console': {
|
'console': {
|
||||||
'level': 'DEBUG',
|
'level': 'DEBUG',
|
||||||
'class': 'logging.StreamHandler',
|
'class': 'logging.StreamHandler',
|
||||||
'formatter': "simple"
|
'formatter': "verbose"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'loggers': {
|
'loggers': {
|
||||||
'connexys': {
|
'khana': {
|
||||||
'handlers': ['console'],
|
'handlers': ['console'],
|
||||||
'level': 'DEBUG',
|
'level': env("LOG_LEVEL", default="DEBUG"),
|
||||||
'propagate': True,
|
'propagate': True,
|
||||||
},
|
},
|
||||||
'stp': {
|
|
||||||
'handlers': ['console'],
|
|
||||||
'level': 'DEBUG',
|
|
||||||
'propagate': True,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
Par exemple:
|
Pour utiliser nos loggers, il suffit de copier le petit bout de code suivant:
|
||||||
|
|
||||||
[source,python]
|
[source,python]
|
||||||
----
|
----
|
||||||
'loggers': {
|
import logging
|
||||||
'mv': { # Parent
|
|
||||||
'handlers': ['file'],
|
|
||||||
'level': 'DEBUG',
|
|
||||||
},
|
|
||||||
'mv.models': { # Enfant
|
|
||||||
'handlers': ['console'],
|
|
||||||
'level': 'DEBUG',
|
|
||||||
'propagate': True,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
----
|
|
||||||
|
|
||||||
Et dans le fichier `mv/models.py`, on a ceci:
|
|
||||||
|
|
||||||
[source,python]
|
|
||||||
----
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
logger.debug('helloworld');
|
logger.debug('helloworld');
|
||||||
----
|
----
|
||||||
|
|
||||||
Le log sera écrit dans la console **ET** dans le fichier.
|
https://docs.djangoproject.com/en/stable/topics/logging/#examples[Par exemples].
|
||||||
|
|
||||||
Par contre, si on retire l'attribut `propagate: True` (ou qu'on le change en `propagate: False`), le même code ci-dessus n'écrit que dans la console. Simplement parce que le log associé à un package considère par défaut ses enfants, alors que le log associé à un module pas. [Par exemple](https://docs.djangoproject.com/en/2.1/topics/logging/#examples).
|
|
||||||
|
|
Loading…
Reference in New Issue