Lors de l'écriture de code tout en regardant le journal de débogage, il est souvent difficile de changer la sortie ON / OFF. Par conséquent, je vais vous présenter une astuce pour changer le niveau de journalisation à partir de la ligne de commande.
Tout d'abord, attachez un exemple de code pour utiliser normalement le module logging
et sortir le journal sur la console. Ci-dessous, j'utilise python3.7.
logging_test.py
import logging
from logging import DEBUG, INFO
def set_logger():
logger = logging.getLogger('logname')
stream = logging.StreamHandler()
logger.addHandler(stream)
logger.setLevel(INFO)
return logger
def main():
logger = set_logger()
logger.debug('debug')
logger.info('info')
if __name__ == "__main__":
main()
Je vais vous expliquer brièvement.
--Le journal est défini avec set_logger
. La valeur de retour «logger» est l'instance utilisée pour la sortie du journal dans le programme.
--stream
détermine la destination de sortie du journal. Cette fois, c'est la sortie de la console, donc j'utilise logging.StreamHandler ()
. Utilisez logging.FileHandler ()
pour sortir dans un fichier.
--Ajoutez la destination de sortie spécifiée par stream
à l'instance de journalisation avec logger.addHandler (stream)
.
--Réglez le niveau de journalisation avec logger.setLevel (INFO)
. Cette fois, il est réglé au niveau ʻINFO (information) . --Et afficher le journal avec
logger.debug ('debug')et
logger.info ('info')`.
Voici le résultat de l'exécution du code ci-dessus.
>python logging_test.py
info
>
Le journal de niveau INFO est sorti, mais le journal de niveau DEBUG n'est pas sorti. Pour sortir les journaux de niveau DEBUG, le paramètre de niveau de journal dans le script doit être logger.setLevel (DEBUG)
.
Il existe un analyseur de ligne de commande python appelé «Click». Cela facilite la mise en œuvre du processus de transmission des arguments de ligne de commande lors de l'exécution d'un fichier python. En parlant de bibliothèques de création CLI, Python Fire
est très simple et pratique, mais je recommande personnellement Click, qui vous permet de spécifier explicitement les variables qui peuvent être transmises à la CLI.
Utilisez Click pour modifier un peu le code précédent.
logging_test.py
import click
import logging
from logging import DEBUG, INFO
def set_logger(debug_mode):
logger = logging.getLogger('logname')
stream = logging.StreamHandler()
logger.addHandler(stream)
if debug_mode is True:
logger.setLevel(DEBUG)
else:
logger.setLevel(INFO)
return logger
@click.command()
@click.option('--debug_mode', '-d', is_flag=True,
help='Show debug log')
def main(debug_mode):
logger = set_logger(debug_mode)
logger.debug('debug')
logger.info('info')
if __name__ == "__main__":
main()
Le grand changement est que la partie de réglage du niveau de journalisation et la fonction main
reçoivent des décorateurs (@ click. ~
Parts). Parlons de ça.
@ click.option ('--debug_mode', '- d', is_flag = True, help = 'Show debug log')
donné à la fonction main
définit la variable debug_mode
. C'est la partie du paramètre à passer à la fonction main
comme argument de ligne de commande. Les arguments sont, dans l'ordre à partir de la gauche, la description lorsque l'option longue, l'option courte, l'indicateur (Vrai / Faux) et l'option d'aide sont spécifiées. Si vous ajoutez --debug_mode
ou -d
au moment de l'exécution, la variable debug_mode
sera True
.debug_mode
reçue comme argument de ligne de commande est passée à la fonction set_logger
. Si l'option -d
est spécifiée, le niveau de journalisation sera DEBUG, et s'il n'est pas spécifié, ce sera INFO.Voici une comparaison des résultats d'exécution lorsqu'ils sont exécutés sans spécifier -d
et lorsqu'ils sont exécutés avec celui-ci spécifié.
>python logging_test.py
info
>python logging_test.py -d
debug
info
>
Si vous spécifiez -d
, même le journal de niveau DEBUG est généré. En procédant ainsi, vous pouvez définir les paramètres de sortie du journal de débogage sans modifier le niveau de journal du code source à chaque fois.
Enfin, voici les sites auxquels je me réfère habituellement en ce qui concerne la journalisation et Click.