logging.info ไม่ปรากฏบนคอนโซล แต่เตือนและทำข้อผิดพลาด


94

เมื่อฉันบันทึกเหตุการณ์ด้วยเหตุการณ์logging.infoนั้นจะไม่ปรากฏในเทอร์มินัล Python

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

ในทางตรงกันข้ามเหตุการณ์ที่บันทึกด้วยlogging.warndo จะปรากฏในเทอร์มินัล

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

มีการเปลี่ยนแปลงระดับสภาพแวดล้อมเพื่อทำการlogging.infoพิมพ์ลงคอนโซลหรือไม่ ฉันต้องการหลีกเลี่ยงการเปลี่ยนแปลงในไฟล์ Python แต่ละไฟล์

คำตอบ:


157

root logger จะตั้งค่าเริ่มต้นเป็นระดับคำเตือนเสมอ ลองโทร

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

และคุณควรจะสบายดี


1
ไม่ต้องโทรครั้งเดียวเท่านั้น คนตัดไม้ที่ถูกสร้างขึ้นเป็นลำดับชั้นด้วยและการตัดไม้ทุกเดือดลงไปตัดไม้ราก การไม่ระบุอาร์กิวเมนต์ใด ๆgetLogger()มันจะส่งคืน root logger ให้คุณ ตราบใดที่คุณไม่ได้แก้ไขตัวตัดไม้อื่น ๆ คุณเพียงแค่ต้องแก้ไข root logger เท่านั้น
Ztyx

18
คุณรู้หรือไม่ว่าทำไม logging.basicConfig (level = logging.INFO) ไม่ทำงาน? ฉันเห็นมันไม่ชัดเจนในเอกสาร
Doppelganger

1
@ P1h3r1e3d13 หากคุณมีเพียง root logger ตัวเดียวซึ่งน่าจะเป็นแนวทางปฏิบัติที่ดีที่สุดใช่
Ztyx

7
สิ่งนี้ใช้ไม่ได้กับ 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 เช่นเดียวกับฉัน 3.6.8 ไม่พิมพ์ข้อความข้อมูลแม้ว่า setLevel จะถูกตั้งค่าเป็นบันทึกก็ตาม INFO
Robert Lugg

28

เช่นเดียวกับที่ @ztyx กล่าวว่าระดับตัวบันทึกเริ่มต้นคือคำเตือน คุณต้องตั้งค่าเป็นระดับที่ต่ำกว่า

คุณสามารถทำได้โดยใช้logging.basicConfigและตั้งค่าระดับตัวบันทึก :

logging.basicConfig(level=logging.DEBUG)

7
ฉันสงสัยว่าทำไมbasicConfig()ไม่เหมาะกับฉันทั้งๆที่logging.getLogger().setLevel()ทำงานได้อย่างเหมาะสม
Shayan Amani

17

วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน แต่รหัสที่นี่ทำ:

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

(ฉันละเว้นบางส่วนของรหัสเพื่อประโยชน์ในการอ่าน)


1
นี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉัน ฉันมีสายlogging.error("Connection timed out!")และถึงแม้จะlevel=logging.DEBUGอยู่ในbasicConfig()นั้นก็จะไม่พิมพ์ลงในคอนโซล การเพิ่มตัวจัดการทำได้ขอบคุณมาก !!
BruceWayne

โปรดทราบว่าตัวจัดการที่คุณใช้กำลังมีบทบาท ตัวอย่างเช่นหากรหัสของคุณมี NullHandler จะไม่มีการพิมพ์อะไรโดยไม่คำนึงถึงคันโยกบันทึก
George

เหมือนกันที่นี่ - ถ้าฉันข้ามอาร์กิวเมนต์ระดับในbasicConfigหรือตั้งค่าไว้เหนือ INFO ตัวบันทึกคอนโซลจะไม่บันทึกอะไรเลย ถ้าฉันออกไปbasicConfigฉันสามารถโทรหาsetLevelคนตัดไม้ได้ทั้งวัน (และฉันสามารถเห็นการเปลี่ยนแปลงระดับโดยการโทรgetEffectiveLevel) แต่จะไม่บันทึกสิ่งใดที่ต่ำกว่าWARNINGระดับ ฉันไม่แน่ใจจริงๆว่านั่นไม่ใช่พฤติกรรมที่ถูกต้อง แต่ไม่ใช่สิ่งที่ฉันคาดหวัง
Hal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.