logging.info tidak muncul di konsol tetapi peringatan dan kesalahan muncul

94

Saat saya membuat log acara dengan logging.info, itu tidak muncul di terminal Python.

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

Sebaliknya, peristiwa yang dicatat dengan logging.warnmemang muncul di terminal.

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

Apakah ada perubahan tingkat lingkungan yang saya dapat lakukan logging.infountuk mencetak ke konsol? Saya ingin menghindari membuat perubahan di setiap file Python.

pelamun
sumber

Jawaban:

157

Logger root selalu default ke level PERINGATAN. Coba telepon

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

dan kamu akan baik-baik saja.

Ztyx
sumber
1
Tidak, Anda hanya perlu meneleponnya sekali. Logger dibangun sebagai hierarki dengan dan semua logging bermuara pada root logger . Dengan tidak menentukan argumen apa pun getLogger(), ini mengembalikan Anda ke logger root. Selama Anda tidak mengubah logger lain, Anda hanya perlu mengubah logger root.
Ztyx
18
Apakah Anda tahu mengapa logging.basicConfig (level = logging.INFO) tidak berfungsi? Saya tidak bisa melihatnya dengan jelas di dokumentasi.
Doppelganger
1
@ P1h3r1e3d13 Jika Anda hanya memiliki satu root logger yang kemungkinan merupakan praktik terbaik, ya.
Ztyx
7
Ini tidak berfungsi pada 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
6
@jeffk, sama dengan saya 3.6.8 tidak mencetak pesan info bahkan ketika setLevel disetel ke logging.INFO
Robert Lugg
28

Seperti yang dikatakan @ztyx bahwa level logger default adalah PERINGATAN. Anda harus mengaturnya ke level yang lebih rendah

Anda dapat melakukannya dengan menggunakan logging.basicConfig dan menyetel level logger :

logging.basicConfig(level=logging.DEBUG)
Vlad Bezden
sumber
7
Saya bertanya-tanya mengapa basicConfig()tidak berhasil untuk saya, meskipun logging.getLogger().setLevel()bekerja dengan sesuai?
Shayan Amani
17

Solusi di atas tidak berhasil untuk saya, tetapi kode di sini berfungsi :

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

(Saya menghilangkan beberapa bagian kode agar mudah dibaca)

Orly
sumber
1
Ini adalah satu-satunya hal yang berhasil untuk saya. Saya memiliki garis dengan logging.error("Connection timed out!")dan bahkan dengan level=logging.DEBUGdi basicConfig(), itu tidak akan mencetak ke konsol. Menambahkan pawang, terima kasih banyak !!
BruceWayne
Ingatlah bahwa pawang yang Anda gunakan sedang memainkan sebuah peran. Jika, misalnya, kode Anda memiliki NullHandler, tidak ada yang akan dicetak terlepas dari tuas loggingnya.
George
Sama di sini - jika saya menghilangkan argumen level basicConfigatau mengaturnya di atas INFO maka logger konsol tidak akan pernah mencatat apapun. Jika saya keluar basicConfigmaka saya dapat memanggil setLevellogger sepanjang hari (dan saya dapat melihat perubahan level dengan menelepon getEffectiveLevel) tetapi tidak akan pernah mencatat apa pun di bawah WARNINGlevel. Saya sebenarnya tidak yakin bahwa itu bukanlah perilaku yang benar tetapi bukan itu yang saya harapkan.
Hal