Ich habe einige Schwierigkeiten mit Python Logging. Ich habe zwei Dateien, main.py und mymodule.py. Im Allgemeinen wird main.py ausgeführt, und es importiert mymodule.py und verwendet einige Funktionen von dort. Aber manchmal werde ich mymodule.py direkt ausführen.Python Logging - Nachricht nicht in Kind
Ich habe versucht, es so zu machen, dass die Protokollierung nur an einem Ort konfiguriert ist, aber etwas scheint falsch.
Hier ist der Code.
# main.py
import logging
import mymodule
logger = logging.getLogger(__name__)
def setup_logging():
# only cofnigure logger if script is main module
# configuring logger in multiple places is bad
# only top-level module should configure logger
if not len(logger.handlers):
logger.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S')
ch.setFormatter(formatter)
logger.addHandler(ch)
if __name__ == '__main__':
setup_logging()
logger.info('calling mymodule.myfunc()')
mymodule.myfunc()
und das importierte Modul:
# mymodule.py
import logging
logger = logging.getLogger(__name__)
def myfunc():
msg = 'myfunc is being called'
logger.info(msg)
print('done with myfunc')
if __name__ == '__main__':
# only cofnigure logger if script is main module
# configuring logger in multiple places is bad
# only top-level module should configure logger
if not len(logger.handlers):
logger.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S')
ch.setFormatter(formatter)
logger.addHandler(ch)
logger.info('myfunc was executed directly')
myfunc()
Wenn ich den Code ausführen, sehe ich diese Ausgabe:
$>python main.py
INFO: 2016-07-14 18:13:04 <module>(22) -- calling mymodule.myfunc()
done with myfunc
Aber ich erwarte, dass dies sehen:
$>python main.py
INFO: 2016-07-14 18:13:04 <module>(22) -- calling mymodule.myfunc()
INFO: 2016-07-14 18:15:09 myfunc(8) -- myfunc is being called
done with myfunc
Jeder hat Irgendeine Idee warum der zweite logging.info Aufruf nicht auf dem Bildschirm gedruckt wird? Danke im Voraus!
Danke, aber es scheint immer noch nicht zu funktionieren. Ich habe den Logging-Level auf INFO gesetzt, bevor ich den Logger-Obj erstellt habe. wie so logging.basicConfig (level = protokollieren.INFO) logger = logging.getLogger (__ name__) Dann innerhalb von Setup_logging, ich füge die ch-Handler, mit einer Ebene von Debug. Dann fügte ich innerhalb von mymodule eine logger.debug-Anweisung hinzu. Wenn ich main.py aufruft, wird die Debug-Nachricht in mymodule nicht angezeigt. – box