100 votes

Un moyen plus facile d'activer la journalisation verbeuse

Je veux ajouter un test de débogage de l'instruction d'impression, si j'active --verbose à partir de la ligne de commande et si j'ai ce qui suit dans le script.

logger.info("test")

J'ai parcouru les questions suivantes, mais je n'ai pas réussi à obtenir la réponse...

177voto

Matthew Leingang Points 625

Je trouve que les deux --verbose (pour les utilisateurs) et --debug (pour les développeurs) utile. Voici comment je m'y prends avec logging y argparse :

import argparse
import logging

parser = argparse.ArgumentParser()
parser.add_argument(
    '-d', '--debug',
    help="Print lots of debugging statements",
    action="store_const", dest="loglevel", const=logging.DEBUG,
    default=logging.WARNING,
)
parser.add_argument(
    '-v', '--verbose',
    help="Be verbose",
    action="store_const", dest="loglevel", const=logging.INFO,
)
args = parser.parse_args()    
logging.basicConfig(level=args.loglevel)

Donc si --debug est défini, le niveau de journalisation est fixé à DEBUG . Si --verbose l'enregistrement est réglé sur INFO . Si ce n'est pas le cas, le manque de --debug définit le niveau de journalisation à la valeur par défaut de WARNING .

98voto

Johnsyweb Points 45395

Vous devez combiner la sagesse de la Tutoriel Argparse con Guide pratique de la journalisation en Python . Voici un exemple...

> cat verbose.py 
#!/usr/bin/env python

import argparse
import logging

parser = argparse.ArgumentParser(
    description='A test script for http://stackoverflow.com/q/14097061/78845'
)
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")

args = parser.parse_args()
if args.verbose:
    logging.basicConfig(level=logging.DEBUG)

logging.debug('Only shown in debug mode')

Lancez l'aide :

> ./verbose.py -h
usage: verbose.py [-h] [-v]

A test script for http://stackoverflow.com/q/14097061/78845

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity

Exécution en mode verbeux :

> ./verbose.py -v
DEBUG:root:Only shown in debug mode

Fonctionnement silencieux :

> ./verbose.py   
>

78voto

Hank Points 1823

Voici une méthode plus concise, qui vérifie les limites et liste les valeurs valides dans l'aide :

parser = argparse.ArgumentParser(description='This is a demo.')
parser.add_argument("-l", "--log", dest="logLevel", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], help="Set the logging level")

args = parser.parse_args()
if args.logLevel:
    logging.basicConfig(level=getattr(logging, args.logLevel))

Utilisation :

demo.py --log DEBUG

38voto

ecerulm Points 1834

Une autre variante consisterait à compter le nombre de -v et utiliser le compte comme un index de l'a list de logging niveaux :

import argparse
import logging

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', action='count', default=0)
args = parser.parse_args()

levels = [logging.WARNING, logging.INFO, logging.DEBUG]
level = levels[min(args.verbose, len(levels) - 1)]  # cap to last level index
logging.basicConfig(level=level)

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
  • Si aucune option n'est fournie, alors logging.WARNING est sélectionné.
  • Si une option -v est fourni, alors logging.INFO est sélectionné.
  • Si deux options -v -v (ou -vv ) ou plus sont fournis, alors logging.DEBUG est sélectionné.

8voto

Stephan Points 327

Vous pouvez explicitement spécifier un niveau sous la forme d'un nombre entier après la balise -v drapeau :

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", const=1, default=0, type=int, nargs="?",
                    help="increase verbosity: 0 = only warnings, 1 = info, 2 = debug. No number means info. Default is no verbosity.")
args = parser.parse_args()

logger = logging.getLogger()
if args.verbose == 0:
    logger.setLevel(logging.WARN) 
elif args.verbose == 1:
    logger.setLevel(logging.INFO) 
elif args.verbose == 2:
    logger.setLevel(logging.DEBUG)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X