web-dev-qa-db-fra.com

Évitez `logger = logging.getLogger (__ name __)`

Nous avons configuré la journalisation comme les documents Django nous a dit:

https://docs.djangoproject.com/en/2.1/topics/logging/#using-logging

# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # Log an error message
        logger.error('Something went wrong!')

Je veux éviter cette ligne dans chaque fichier Python qui veut se connecter:

logger = logging.getLogger(__name__)

Je veux que ce soit simple:

logging.error('Something went wrong!')

Mais nous voulons garder une fonctionnalité: nous voulons voir le nom de fichier Python dans la sortie de journalisation).

Jusqu'à présent, nous utilisons ce format:

'%(asctime)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s'

Exemple de sortie:

2016-01-11 12:12:31 myapp.foo +68: ERROR Something went wrong

Comment éviter logger = logging.getLogger(__name__)?

32
guettli

Vous pouvez utiliser logging.basicConfig pour définir l'interface par défaut disponible via logging comme suit:

import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s',
                    )

Cette définition sera désormais utilisée chaque fois que vous effectuez les opérations suivantes n'importe où dans votre application:

import logging
logging.error(...)

Tandis que __name__ n'est pas disponible, l'équivalent (et d'autres options) sont disponibles via les attributs par défaut LogRecord qui peuvent être utilisés pour le formatage des chaînes d'erreur - y compris module, filename et pathname. Ce qui suit est une démonstration à deux scripts de ceci en action:

scripta.py

import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(module)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s',
                    )

from scriptb import my_view

my_view()

scriptb.py

import logging

def my_view():
    # Log an error message
    logging.error('Something went wrong!')

La définition de journalisation est définie dans scripta.py, avec le paramètre module ajouté. Dans scriptb.py nous devons simplement importer logging pour avoir accès à cette valeur par défaut définie. Lors de l'exécution scripta.py la sortie suivante est générée:

2016-01-14 13:22:24,640 scriptb root.my_view +9: ERROR    [14144] Something went wrong!

Ce qui montre le module (scriptb) où la journalisation de l'erreur se produit.

Selon cette réponse vous pouvez continuer à utiliser n'importe quelle configuration de journalisation de Django par module, en désactivant Django manipulant et configurant le gestionnaire racine comme suit:

# settings.py - Django config
LOGGING_CONFIG = None # disables Django handling of logging
LOGGING = {...}  # your standard Django logging configuration

import logging.config
logging.config.dictConfig(LOGGING)
25
mfitzp

qu'en est-il du nom de chemin? de https://docs.python.org/2/library/logging.html#formatter-objects

/Users/jluc/kds2/wk/explore/test_so_41.py

import logging

#another module, just to have another file...
import test_so_41b

#not so much to use basicConfig as a quick usage of %(pathname)s
logging.basicConfig(level=logging.DEBUG,
                    format='%(pathname)s %(asctime)s %(levelname)s %(message)s',
                    # filename='/tmp/myapp.log',
                    # filemode='w',
                    )

logging.debug('A debug message')
logging.info('Some information')
logging.warning('A shot across the bows')

test_so_41b.dosomething("hey there")

/Users/jluc/kds2/wk/explore/test_so_41b.py

import logging

def dosomething(msg):
    logging.info(msg)

audrey: explorez jluc $ python test_so_41.py

sortie:

test_so_41.py 2016-01-16 14:46:57,997 DEBUG A debug message
test_so_41.py 2016-01-16 14:46:57,997 INFO Some information
test_so_41.py 2016-01-16 14:46:57,997 WARNING A shot across the bows
/Users/jluc/kds2/wk/explore/test_so_41b.py 2016-01-16 14:46:57,997 INFO hey there
3
JL Peyret