J'apprends le module logging en Python.

Cependant, si je me connecte comme ça

logging.basicConfig(filename='mylog.log',format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG)

while 1:
    logging.debug("something")
    time.sleep(1)

Et interrompre le processus avec l'événement control-C (ou le processus est tué), rien que je puisse obtenir du fichier journal.

Puis-je enregistrer le plus de journaux quoi qu'il arrive?

————

ÉDITER

La question semble devenir plus complexe:

J'ai importé scipy, numpy, pyaudio dans mon script, et j'ai:

forrtl: erreur (200): arrêt du programme en raison d'un événement control-C

Au lieu de KeyboardInterrupt

J'ai lu cette question: Ctrl-C plante Python après l'importation de scipy.stats

Et ajoutez ces lignes à mon script:

import _thread
import win32api
def handler(dwCtrlType, hook_sigint=_thread.interrupt_main):
    if dwCtrlType == 0: # CTRL_C_EVENT
        hook_sigint()
        return 1 # don't chain to the next handler
    return 0 # chain to the next handler

Ensuite:

try:
    main()
except KeyboardInterrupt:
    print("exit manually")
    exit()

Maintenant, le script s'arrête sans aucune information si j'utilise ctrl + C. print("exit manually") n'apparaît pas. Bien sûr, pas de journaux.

Résolue

Une erreur stupide! J'exécute le script lorsque le répertoire de travail est System32 et que je veux trouver le journal dans le chemin du script.

Après avoir changé d'itinéraire comme ça, tout va bien.

logging.basicConfig(filename=os.path.dirname(sys.argv[0])+os.sep+'mylog.log',format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG)
0
PaleNeutron 22 juil. 2015 à 02:23

2 réponses

Meilleure réponse

Lorsque vous vous connectez à l'aide de logging.debug, logging.info, ..., logging.critical, vous utilisez l'enregistreur root . Je suppose que vous ne faites rien pour configurer la journalisation que vous n'avez pas montrée, donc vous utilisez la configuration par défaut prête à l'emploi. (Ceci est configuré pour vous par le premier appel à logging.debug, qui appelle logging.basicConfig()).

Le niveau de journalisation par défaut de l'enregistreur racine est logging.WARNING (comme mentionné par exemple dans https://docs.python.org/3/howto/logging.html#logging-basic-tutorial). Ainsi, rien de ce que vous connectez avec logging.debug ou logging.info n'apparaîtra :) Si vous remplacez logging.debug par logging.warning (ou .error ou .critical), vous verrez la sortie de journalisation.

Pour que votre code fonctionne tel quel, définissez le niveau de journalisation du journal racine sur logging.DEBUG avant la boucle:

import logging
import time

# logging.getLogger() returns the root logger
logging.getLogger().setLevel(logging.DEBUG)

while 1:
    logging.debug("something")
    time.sleep(1)
1
BrianO 22 juil. 2015 à 01:07

Pour l'événement CTRL + C , utilisez un try - except pour intercepter l'exception KeyboardInterrupt.

0
cdonts 21 juil. 2015 à 23:30