logging.info konsolda görünmüyor ancak uyarı ve hata yapıyor


94

İle bir olayı günlüğe logging.infokaydettiğimde, Python terminalinde görünmüyor.

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

Bunun aksine, günlüğe kaydedilen olaylar logging.warnterminalde görünür.

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

logging.infoKonsola yazdırmak için yapabileceğim bir ortam seviyesi değişikliği var mı ? Her Python dosyasında değişiklik yapmaktan kaçınmak istiyorum.

Yanıtlar:


157

Kök kaydedici her zaman varsayılan olarak UYARI düzeyindedir. Aramayı deneyin

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

ve iyi olmalısın.


1
Hayır, sadece bir kez aramanız yeterli. Kaydedici, bir hiyerarşi olarak oluşturulur ve tüm günlük kaydı bir kök kaydediciye indirgenir . İçin herhangi bir argüman belirtmeyerek getLogger()size kök günlükçüyü döndürür. Diğer kaydedicileri değiştirmediğiniz sürece, yalnızca kök kaydediciyi değiştirmeniz gerekir.
Ztyx

18
Logging.basicConfig (level = logging.INFO) neden çalışmadığını biliyor musunuz? Belgelerde net göremiyorum.
Doppelganger

1
@ P1h3r1e3d13 Muhtemelen en iyi uygulamalar olan tek bir kök kaydediciniz varsa, evet.
Ztyx

7
Bu Python 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

6
@jeffk, benimle aynı 3.6.8, setLevel oturum açma olarak ayarlandığında bile bilgi mesajlarını yazdırmıyor.INFO
Robert Lugg

28

@Ztyx'in söylediği gibi, varsayılan logger seviyesi UYARI'dır. Daha düşük bir seviyeye ayarlamalısın

Bunu logging.basicConfig kullanarak ve günlükçü düzeyini ayarlayarak yapabilirsiniz :

logging.basicConfig(level=logging.DEBUG)

7
Uygun şekilde çalışmasına basicConfig()rağmen neden benim için çalışmadığını merak ediyorum logging.getLogger().setLevel()?
Shayan Amani

17

Yukarıdaki çözümler benim için işe yaramadı, ama kod burada yaptı:

# 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)

(Okunabilirlik uğruna kodun bazı kısımlarını atladım)


1
Benim için işe yarayan tek şey bu. Ben bir çizgi vardı logging.error("Connection timed out!")ve hatta birlikte level=logging.DEBUGde basicConfig(), bu konsola yazdırmak olmaz. İşleyiciyi ekledim, çok teşekkürler !!
BruceWayne

Kullandığınız işleyicinin bir rol oynadığını unutmayın. Örneğin, kodunuzda NullHandler varsa, günlük tutma kolundan bağımsız olarak hiçbir şey yazdırılmaz.
George

Burada da aynı - seviye argümanını INFO'da atlarsam basicConfigveya onu INFO üzerine ayarlarsam, konsol kaydedici hiçbir zaman hiçbir şeyi kaydetmez. Eğer dışarı çıkarsam, tüm gün bir kaydediciyi basicConfigarayabilirim setLevel(ve arayarak seviye değişikliğini görebilirim getEffectiveLevel) ancak WARNINGseviyenin altındaki hiçbir şeyi asla kaydetmez . Bunun doğru davranış olmadığından emin değilim ama beklediğim bu değil.
Hal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.