2017-02-03 2 views
-2

sind auf einem Python App arbeiten, die Logger-FunktionenWarum ignoriert Python mein Formatierungsprogramm in der Konsole?

Hier implementiert ist mein Code, die Form der offiziellen site genommen wird:

import logging 

#create logger 
logger = logging.getLogger("simple_example") 
logger.setLevel(logging.DEBUG) 

#create console handler and set level to debug 
fh = logging.RotatingFileHandler(MyFile, etc) 
fh.setLevel(logging.DEBUG) 

#create formatter 
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - 
    %(message)s") 
#add formatter to fh 
fh.setFormatter(formatter) 
#add fh to logger 
logger.addHandler(fh) 

#"application" code 
logger.debug("debug message") 
logger.info("info message") 
logger.warn("warn message") 
logger.error("error message") 
logger.critical("critical message") 

und hier ist die Ausgabe in der Datei: , die perfekt ist

2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message

2005-03-19 15:10:26,620 - simple_example - INFO - info message

2005-03-19 15:10:26,695 - simple_example - WARNING - warn message

2005-03-19 15:10:26,697 - simple_example - ERROR - error message

2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message

aber hier ist die Ausgabe im Terminal:

DEBUG: debug message

INFO: info message

WARNING: warn message

ERROR: error message

CRITICAL: critical message

, die mich verrückt macht, da ich nicht den Zeitstempel in der Konsole zu sehen bekommen ...

Ich habe auch versucht, die Schaffung einen anderen Handler:

ch = logging.StreamHandler() 
ch.setLevel(logging.DEBUG) 

und die Zugabe zu Logger ...

aber die einzige Sache, die ich bekomme, ist, dass der Logger zweimal in der Konsole jede msg druckt ... eine vollkommene Ordnung und die falsche, wie ich am Anfang erklärte

+0

'fh.setFormatter' nicht den Formatierer' logger', so wird festgelegt, was Das Thema? –

+0

das ist das Problem, ich will, dass fh entweder in der Konsole mit dem Format, das ich eingestellt loggen oder überhaupt nicht in der Konsole, sondern nur in der Datei ... –

+0

Scheint, Sie kopiert das erste Beispiel auf dieser Seite, nicht die * Mehrere Handler und Formatierer * eine, die Sie wahrscheinlich näher an das bringt, was Sie wollen –

Antwort

0

Eine Initialisierung in der Grundkonfiguration auf dem Logger dafür notwendig ist:

logging.basicConfig(streamä0sys.stdout, level=logging.INFO, format=myFormat) 

wo

myFormat= "%(asctime)-15s %(clientip)s %(user)-8s %(message)s" 
3

Sie haben auch die Formatierungs zum anderen Handler hinzuzufügen:

#create console handler and set level to debug 
fh = logging.RotatingFileHandler(MyFile, etc) 
fh.setLevel(logging.DEBUG) 

#create formatter 
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - 
    %(message)s") 
#add formatter to fh 
fh.setFormatter(formatter) 
#add fh to logger 
logger.addHandler(fh) 

ch = logging.StreamHandler() 
ch.setLevel(logging.DEBUG) 
ch.setFormatter(formatter) 
logger.addHanlder(ch) 
+0

Ich habe nur einen Handler (der rotierendeFileHandler) welche andere meinst du? –

+0

der StreamHandler eins. –

1

Hier ist, was ich für die Protokollierung in einer Datei verwenden und in der Konsole:

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s\t%(message)s', datefmt='%m-%d %H:%M', filename=logfile, filemode='a') 
# define a Handler which writes INFO messages or higher to the sys.stderr 
console = logging.StreamHandler() 
console.setLevel(logging.DEBUG) 
# set a format which is simpler for console use 
formatter = logging.Formatter('%(asctime)s %(levelname)s\t%(message)s') 
# tell the handler to use this format 
console.setFormatter(formatter) 
# add the handler to the root logger 
logging.getLogger('').addHandler(console) 
# Now, we can log to the root logger, or any other logger. First the root... 
logging.info('LOGGING PATH: %s', logfile) 

Dann können Sie gleich eingestellt Ausgabe für die Datei und die Konsole.

Verwandte Themen