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.
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.
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__)
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')
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")