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.

Tagträumer
quelle

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.

Ztyx
quelle
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)
Vlad Bezden
quelle
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.)

Orly
quelle
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