web-dev-qa-db-fra.com

Utilisation de la journalisation python avec AWS Lambda

Comme le suggère la documentation AWS:

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_logging_handler(event, context):
    logger.info('got event{}'.format(event))
    logger.error('something went wrong')

Maintenant j'ai fait:

import logging
logging.basicConfig(level = logging.INFO)
logging.info("Hello World!")

Le premier extrait de code est imprimé dans la console Cloud Watch, mais le second, no.

Je n'ai vu aucune différence, car les deux extraits utilisent le consignateur racine.

26
p.magalhaes

Copié directement à partir de la réponse du haut dans la question @ La réponse de StevenBohrer renvoie à (cela a été mon truc, remplaçant la dernière ligne par ma propre configuration):

root = logging.getLogger()
if root.handlers:
    for handler in root.handlers:
        root.removeHandler(handler)
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG)
20
Brett Beatty

J'ai eu un problème similaire et je soupçonne que le conteneur lambda appelle logging.basicConfig pour ajouter des gestionnaires AVANT que le code lambda soit importé. Cela semble être une mauvaise forme ...

La solution de contournement était de voir si les gestionnaires de consignateurs racine étaient configurés et, le cas échéant, supprimez-les, ajoutez mon formateur et le niveau de consignation souhaité (à l'aide de basicConfig), puis restaurez les gestionnaires.

Voir cet article Journalisation Python avant d’exécuter logging.basicConfig?

12
Steven Bohrer

En fait, probablement, ne référençant pas le même enregistreur, . Dans le premier extrait, enregistrez le retour de: logging.Logger.manager.loggerDict

Il retournera une dict des enregistreurs déjà initialisés.

En outre, dans la documentation logging, une remarque importante sur logging.basicConfig:

Effectue la configuration de base du système de journalisation en créant un StreamHandler avec un formateur par défaut et en l'ajoutant au consignateur racine. Les fonctions debug (), info (), warning (), error () et critical () appellent automatiquement basicConfig () si aucun gestionnaire n'est défini pour le consignateur racine.

Cette fonction ne fait rien si le logger racine a déjà des gestionnaires configurés pour elle.

Source: https://docs.python.org/2/library/logging.html#logging.basicConfig

3
HEADLESS_0NE

Essentiellement, le correctif AWS Logging Monkey doit être traité de manière très particulière, où:

  1. Le niveau de journalisation est défini à partir du niveau TOP du script (par exemple, au moment de l'importation).
  2. Les instructions de journal qui vous intéressent sont invoquées depuis la fonction lambda

Comme il est généralement considéré comme une bonne forme de ne pas exécuter de code arbitraire lors de l’importation de module Python, vous devriez généralement pouvoir restructurer votre code de sorte que les tâches lourdes ne se produisent que dans la fonction lambda.

0
Edward Z. Yang