web-dev-qa-db-fra.com

Django connexion à la console

J'essaie de configurer un enregistreur qui se connectera à la console (je le veux parce que j'utilise Heroku avec Papertrails (l'addon de journalisation Heroku) et les choses écrites sur la console s'afficheront dans Papertrails, ce qui la rendra filtrable et toutes les Belles fonctionnalités Papertrail.)

Dans les paramètres, j'ai d'abord essayé ce qui suit:

LOGGING = {
    'handlers' = {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'mysite.log',
            'formatter': 'verbose'
        },
        'console':{
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    (...)
    'loggers'={
        (...)
        'page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    (...)
}

selon la page de journalisation de Django (pour ceux qui n'utilisent pas Mezzanine, les processeurs de page sont ce que Mezzanine exécute chaque fois que vous ouvrez une page; vous pouvez les considérer comme étant les vues de Django, mais ils ne font que le contexte, pas le rendu).

Sur page_processors.py j'ai

import logging
logger = logging.getLogger(__name__)

@process_for(MyPage):
def myfunc(request, Page):
    logger.info('page_processor logging test')
    print 'my page_processor print'
    (...)

Lorsque je rafraîchis la page, je ne vois pas l'enregistreur mais je vois l'impression ET le journal dans le fichier:

[02/Mar/2014 23:07:10] INFO [myApp.page_processors:13] page_progessor logging test

et donc je sais que la logique fonctionne. Après avoir googlé un peu, j'ai trouvé this et this page qui résout précisément ce problème. Il dit que par défaut logging.StreamHandler se connecte à STDERR. Si nous voulons nous connecter à STDOUT, vous devez ajouter l'argument de mot clé 'stream' à la construction logging.StreamHandler, et ainsi configurer le gestionnaire en tant que tel:

'handlers':{
    (...)
    'console':{
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'stream': sys.stdout
    },
}

Il s'avère que cela ne fonctionne toujours pas, et je ne reçois aucune erreur ou quoi que ce soit, et je vois toujours l'impression et le journal des fichiers. Mais pas l'enregistreur de console.

Que se passe-t-il?

EDIT: J'ai essayé this , cela ne fait aucune différence.

24
oneloop

Je l'ai finalement compris. Voici ce qui se passait.

Lorsque vous définissez un enregistreur à l'aide de getLogger, vous donnez un nom à un enregistreur, dans ce cas

logger = logging.getLogger(__name__)

et vous devez ensuite définir le comportement d'un enregistreur portant ce nom dans la configuration LOGGING. Dans ce cas, puisque ce fichier se trouve dans un module, le nom de l'enregistreur devient myApp.page_processors, et non page_processors, donc l'enregistreur nommé "page_processors" dans le dict LOGGING n'est jamais appelé. Alors, pourquoi la journalisation du fichier fonctionnait-elle? Parce que dans le (...) que je montre dans le code, il y a un autre enregistreur nommé 'myApp' qui est apparemment appelé à la place, et que l'on écrit dans le fichier.

La solution à cette question consiste donc à nommer correctement l'enregistreur:

LOGGING = {
    # (...)
    'loggers': {
        # (...)
        'myApp.page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    # (...)
}
29
oneloop

Le script suivant:

import logging, logging.config
import sys

LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'stream': sys.stdout,
        }
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO'
    }
}

logging.config.dictConfig(LOGGING)
logging.info('Hello')

écrit Hello dans sys.stdout, comme cela peut être vérifié en canalisant sa sortie vers un fichier. Ainsi, votre problème est susceptible d'être ailleurs (ou peut-être que sys.stdout n'est pas ce que vous attendez). Vous pouvez essayer avec sys.__stdout__ pour voir si cela fait une différence.

19
Vinay Sajip

J'écris ceci pour comprendre les nuls comme moi.

Dans settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'app_api': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
    }

Quelque part dans les vues de votre application

import logging
logger = logging.getLogger('app_api') #from LOGGING.loggers in settings.py

try:
    one = 1/0
except Exception as e:
    logger.error(e)
0
rogoro