web-dev-qa-db-fra.com

Python utilisant la méthode basicConfig pour se connecter à la console et au fichier

Je ne sais pas pourquoi ce code s'imprime à l'écran, mais pas dans le fichier? Le fichier "example1.log" est créé, mais rien n'y est écrit. 

#!/usr/bin/env python3
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(message)s',
                    handlers=[logging.FileHandler("example1.log"),
                              logging.StreamHandler()])
logging.debug('This message should go to the log file and to the console')
logging.info('So should this')
logging.warning('And this, too')

J'ai "contourné" ce problème en créant un objet de journalisation ( exemple de code ), mais il n'arrête pas de me cacher pourquoi l'approche de basicConfig () a échoué?

PS. Si je change l'appel de basicConfig en:

logging.basicConfig(level=logging.DEBUG,
                    filename="example2.log",
                    format='%(asctime)s %(message)s',
                    handlers=[logging.StreamHandler()])

Ensuite, tous les journaux sont dans le fichier et rien n’est affiché dans la console.

41
Jovik

Je ne peux pas le reproduire sur Python 3.3. Les messages sont écrits à la fois à l’écran et au 'example2.log'. Sur Python <3.3, le fichier est créé mais il est vide.

Le code:

from logging_tree import printout  # pip install logging_tree
printout()

montre que FileHandler() n'est pas attaché à l'enregistreur racine sous Python <3.3.

La documentation de logging.basicConfig() indique que l'argument handlers est ajouté dans Python 3.3. L'argument handlers n'est pas mentionné dans la documentation Python 3.2.

17
jfs

Essayez ce travail fonctionne bien (testé en python 2.7) pour console et fichier  

# set up logging to file
logging.basicConfig(
     filename='Twitter_effect.log',
     level=logging.INFO, 
     format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',
     datefmt='%H:%M:%S'
 )

# set up logging to console
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

logger = logging.getLogger(__name__)
30
kakapy

Dans l'exemple ci-dessous, vous pouvez spécifier la destination du journal en fonction de son niveau. Par exemple, le code ci-dessous permet à tous les journaux du niveauINFOd'aller dans le fichier journal et à tous les éléments ci-dessusERREURniveau à la console. 

import logging
logging.root.handlers = []
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO , filename='ex.log')

# set up logging to console
console = logging.StreamHandler()
console.setLevel(logging.ERROR)
# set a format which is simpler for console use
formatter = logging.Formatter('%(asctime)s : %(levelname)s : %(message)s')
console.setFormatter(formatter)
logging.getLogger("").addHandler(console)

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.exception('exp')
5
Wesam Na

Fonction d’enregistrement réutilisable.

def logger(logPath,fileName):
    logging.basicConfig(
        format='%(asctime)s - %(levelname)s - %(message)s',
        level=logging.INFO,
        handlers=[
            logging.FileHandler("{0}/{1}.log".format(logPath,fileName)),
            logging.StreamHandler()
        ])
    return logging

Sur Autre fichier python, importez la logger

logger().info("this is info")
logger().critical('404')
logger().error("this is error")

 enter image description here

0
as - if