it-swarm.com.de

Python verwendet die basicConfig-Methode zur Anmeldung an Konsole und Datei

Ich weiß nicht, warum dieser Code auf dem Bildschirm gedruckt wird, aber nicht in der Datei? Die Datei "example1.log" wird erstellt, aber dort wird nichts geschrieben. 

#!/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')

Ich habe dieses Problem umgangen, indem ich ein Protokollierungsobjekt ( example code ) erstellt habe, aber es stört mich immer wieder, warum der Ansatz von basicConfig () fehlgeschlagen ist?

PS. Wenn ich den Aufruf von basicConfig ändere,

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

Dann sind alle Protokolle in der Datei und in der Konsole wird nichts angezeigt

41
Jovik

Ich kann es nicht auf Python 3.3 reproduzieren. Die Meldungen werden sowohl auf den Bildschirm als auch auf den 'example2.log' geschrieben. Auf Python <3.3 wird die Datei erstellt, sie ist jedoch leer.

Der Code:

from logging_tree import printout  # pip install logging_tree
printout()

zeigt, dass FileHandler() nicht an den Root-Logger unter Python <3.3 angehängt ist.

Die Dokumente für logging.basicConfig() sagen, dass das Argument handlers in Python 3.3 hinzugefügt wird. Das Argument handlers wird in der Python 3.2-Dokumentation nicht erwähnt.

17
jfs

Probieren Sie es aus (getestet in Python 2.7) für console und file 

# 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

Im folgenden Beispiel können Sie das Protokollziel basierend auf seiner Stufe angeben. Mit dem folgenden Code können beispielsweise alle Protokolle über die Ebene INFO in die Protokolldatei aufgenommen werden, und alle über die Ebene ERROR gehen zur Konsole. 

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

Wiederverwendbare Loggerfunktion.

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

Importieren Sie in einer anderen Python-Datei die logger-Datei.

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

 enter image description here

0
as - if