J'ai un script python qui m'envoie toutes les 10 minutes un email avec tout ce qui est écrit dans la console. Je lance ceci avec le crontab dans mon ubuntu 18.04 vps. Parfois, il n'envoie pas le courrier, donc je suppose que lorsqu'une erreur se produit, l'exécution s'arrête, mais comment puis-je obtenir les erreurs à écrire dans un fichier txt afin que je puisse analyser l'erreur?

3
strangethingspy 14 mars 2019 à 21:10

2 réponses

Meilleure réponse

Module de journalisation

Pour démontrer l'approche avec le module logging, ce serait l'approche générale

import logging

# Create a logging instance
logger = logging.getLogger('my_application')
logger.setLevel(logging.INFO) # you can set this to be DEBUG, INFO, ERROR

# Assign a file-handler to that instance
fh = logging.FileHandler("file_dir.txt")
fh.setLevel(logging.INFO) # again, you can set this differently

# Format your logs (optional)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter) # This will set the format to the file handler

# Add the handler to your logging instance
logger.addHandler(fh)

try:
    raise ValueError("Some error occurred")
except ValueError as e:
    logger.exception(e) # Will send the errors to the file

Et si je cat file_dir.txt

2019-03-14 14:52:50,676 - my_application - ERROR - Some error occurred
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: Some error occurred

Imprimer en tant que fichier

Comme je l'ai souligné dans les commentaires, vous pourriez accomplir cela avec print également (je ne suis pas sûr que vous serez applaudi pour cela)

# Set your stdout pointer to a file handler
with open('my_errors.txt', 'a') as fh:
    try:
        raise ValueError("Some error occurred")
    except ValueError as e:
        print(e, file=fh)

cat my_errors.txt

Some error occurred

Notez que logging.exception inclut le retraçage dans ce cas, ce qui est l'un des nombreux avantages énormes de ce module

Éditer

Dans un souci d'exhaustivité, le module traceback exploite un module similaire approche comme print, où vous pouvez fournir un descripteur de fichier :

import traceback
import sys

with open('error.txt', 'a') as fh:
    try:
        raise ValueError("Some error occurred")
    except ValueError as e:
        e_type, e_val, e_tb = sys.exc_info()
        traceback.print_exception(e_type, e_val, e_tb, file=fh)

Cela inclura toutes les informations que vous voulez de logging

3
C.Nivs 18 mars 2019 à 12:53

Vous pouvez utiliser le module logging comme suggéré dans les commentaires (peut-être supérieur mais en dehors de mes connaissances), ou rattraper les erreurs avec try et except comme :

try:
    pass
    #run the code you currently have
except Exception as e: # catch ALLLLLL errors!!!
    print(e) # or more likely you'd want something like "email_to_me(e)"

Bien que cela soit généralement mal vu d'attraper toutes les exceptions, car si votre programme échoue pour quelle qu'en soit la raison, il sera englouti dans la clause except donc une meilleure L'approche consiste à déterminer quelle erreur spécifique vous rencontrez comme IndexError, puis à attraper cette erreur spécifique comme :

try:
    pass
    #run the code you currently have
except IndexError as e: # catch only indexing errors!!!
    print(e) # or more likely you'd want something like "email_to_me(e)"
0
Reedinationer 14 mars 2019 à 18:28