logging.info wird nicht auf der Konsole angezeigt, aber Warnung und Fehler


86

Wenn ich ein Ereignis mit protokolliere logging.info, wird es nicht im Python-Terminal angezeigt.

import logging
logging.info('I am info')  # no output

Im Gegensatz dazu werden mit protokollierte Ereignisse logging.warnim Terminal angezeigt.

import logging
logging.warn('I am warning')  # outputs "I am warning"

Kann ich die Umgebungsebene ändern, um logging.infoauf der Konsole zu drucken? Ich möchte vermeiden, Änderungen an jeder Python-Datei vorzunehmen.

Antworten:


147

Der Root-Logger ist standardmäßig auf WARNING eingestellt. Versuchen Sie anzurufen

logging.getLogger().setLevel(logging.INFO)

und es sollte dir gut gehen.


1
Nein, Sie müssen es nur einmal anrufen. Der Logger wird als Hierarchie mit erstellt, und die gesamte Protokollierung läuft auf einen Root-Logger hinaus . Wenn Sie kein Argument für getLogger()angeben, erhalten Sie den Root-Logger zurück. Solange Sie die anderen Logger nicht ändern, müssen Sie nur den Root-Logger ändern.
Ztyx

16
Wissen Sie, warum logging.basicConfig (level = logging.INFO) nicht funktioniert? Ich kann es in der Dokumentation nicht klar erkennen.
Doppelgänger

1
@ P1h3r1e3d13 Wenn Sie nur einen einzigen Root-Logger haben, der wahrscheinlich Best Practices ist, ja.
Ztyx

5
Dies funktioniert nicht auf Python 3.5:Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux >>> import logging >>> rootLog = logging.getLogger() >>> rootLog.setLevel(logging.INFO) >>> rootLog.info('all the kings horses') >>> rootLog.warning('all the kings men') all the kings men
Jeff K

3
@jeffk, das gleiche gilt für mich 3.6.8 druckt keine Infomeldungen, selbst wenn setLevel auf logging eingestellt ist.INFO
Robert Lugg

26

Wie @ztyx sagte, ist die Standard-Logger-Ebene WARNUNG. Sie müssen es auf eine niedrigere Ebene einstellen

Sie können dies tun, indem Sie logging.basicConfig verwenden und die Logger-Ebene festlegen :

logging.basicConfig(level=logging.DEBUG)

6
Ich frage mich, warum basicConfig()es bei mir nicht funktioniert, obwohl es logging.getLogger().setLevel()angemessen funktioniert.
Shayan Amani

13

Die oben genannten Lösungen haben bei mir nicht funktioniert, aber der Code hier hat funktioniert:

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(Ich habe Teile des Codes aus Gründen der Lesbarkeit weggelassen.)


1
Dies ist das einzige, was für mich funktioniert hat. Ich hatte eine Zeile mit logging.error("Connection timed out!")und selbst mit der level=logging.DEBUGin basicConfig(), es würde nicht auf Konsole gedruckt. Das Hinzufügen des Handlers hat es getan, vielen Dank !!
BruceWayne

Denken Sie daran, dass der von Ihnen verwendete Handler eine Rolle spielt. Wenn Ihr Code beispielsweise den NullHandler hätte, würde unabhängig vom Protokollierungshebel nichts gedruckt.
George

Gleiches hier - wenn ich das Level-Argument weglasse basicConfigoder über INFO setze, protokolliert der Konsolenlogger niemals etwas. Wenn ich weglasse, kann ich den ganzen Tag einen Logger basicConfiganrufen setLevel(und ich kann sehen, wie sich das Level ändert, indem getEffectiveLevelich anrufe ), aber es wird niemals etwas unter dem WARNINGLevel protokollieren . Ich bin mir nicht sicher, ob das nicht das richtige Verhalten ist, aber es ist nicht das, was ich erwartet hatte.
Hal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.