รับเอาต์พุตจากโมดูลการบันทึกใน IPython Notebook


128

เมื่อฉันเรียกใช้สิ่งต่อไปนี้ภายในโน้ตบุ๊ก IPython ฉันไม่เห็นผลลัพธ์ใด ๆ :

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")

ใครทราบวิธีทำให้ฉันเห็นข้อความ "ทดสอบ" ในสมุดบันทึก


คุณใช้ IPython เวอร์ชันใดเนื่องจากใช้งานได้ใน 1.0
Viktor Kerkez

@ViktorKerkez ipython3 notebook --versionกลับมา1.0.0
Kyle Brandt

imgur.com/1b7nGZzฉันได้รับสิ่งนี้เมื่อลองใช้รหัสของคุณ
Viktor Kerkez

@ViktorKerkez: ฉันไม่เข้าใจเดาว่าฉันควรจะยื่นเรื่อง ...
Kyle Brandt

คำตอบ:


130

ลองทำตาม:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")

ตามlogging.basicConfig :

ทำการกำหนดค่าพื้นฐานสำหรับระบบบันทึกโดยสร้าง StreamHandler ด้วย Formatter เริ่มต้นและเพิ่มไปยัง root logger ฟังก์ชัน debug () ข้อมูล () คำเตือน () ข้อผิดพลาด () และสำคัญ () จะเรียก basicConfig () โดยอัตโนมัติหากไม่มีการกำหนดตัวจัดการสำหรับ root logger

ฟังก์ชันนี้จะไม่ทำอะไรเลยหาก root logger มีตัวจัดการที่กำหนดค่าไว้แล้ว

ดูเหมือนว่าสมุดบันทึก ipython เรียก basicConfig (หรือ set handler) ที่ไหนสักแห่ง


4
สิ่งเดียวกันนี้เกิดขึ้นในคอนโซล IPython ปกติ: จะไม่พิมพ์อะไรเลยเว้นแต่loggerสร้างรูท
Ioannis Filippidis

1
โซลูชันนี้ใช้งานได้อีกครั้งในipykernel4.5 (อาจเร็วถึง 4.4) github.com/jupyter/notebook/issues/1397
pylang

18
ไม่ได้ผลอีกต่อไป ไม่ใช่กับ Jupyter Notebook 5.3.0
Wesam

65

หากคุณยังต้องการใช้basicConfigให้โหลดโมดูลการบันทึกซ้ำเช่นนี้

from importlib import reload  # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')

16
สำหรับใครที่พยายามทำใน Python 3: reloadตอนนี้imp.reload
kuzzooroo

11
สำหรับ Python 3.5 คุณควรใช้importlib.reloadเนื่องจากกำลังเลิกใช้โมดูล imp
Webucator

2
หากใครกำลังมีปัญหากับ Spyder ในการบันทึก (ซึ่งความพยายามทั้งหมดในการปรับเปลี่ยนพฤติกรรมคนตัดไม้ไม่ประสบความสำเร็จ) สิ่งนี้ก็จบลงด้วยการไล่ล่าห่านตลอดทั้งวัน github.com/spyder-ide/spyder/issues/2572ขอบคุณมาก!
FrenchKheldar

28

ความเข้าใจของฉันคือเซสชัน IPython เริ่มต้นการบันทึกดังนั้น basicConfig จึงไม่ทำงาน นี่คือการตั้งค่าที่เหมาะกับฉัน (ฉันหวังว่านี่จะไม่ดูแย่มากนักเพราะฉันต้องการใช้กับโน้ตบุ๊กเกือบทั้งหมดของฉัน):

import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='mylog.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)

ตอนนี้เมื่อฉันวิ่ง:

logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning.')

ฉันได้รับไฟล์ "mylog.log" ในไดเร็กทอรีเดียวกับสมุดบันทึกของฉันที่มี:

2015-01-28 09:49:25,026 - root - ERROR - hello!
2015-01-28 09:49:25,028 - root - DEBUG - This is a debug message
2015-01-28 09:49:25,029 - root - INFO - this is an info message
2015-01-28 09:49:25,032 - root - WARNING - tbllalfhldfhd, warning.

โปรดทราบว่าหากคุณรันสิ่งนี้ใหม่โดยไม่รีสตาร์ทเซสชัน IPython มันจะเขียนรายการที่ซ้ำกันไปยังไฟล์เนื่องจากตอนนี้จะมีการกำหนดตัวจัดการไฟล์สองตัว


3
หากต้องการทำให้ "ดูแย่" น้อยลงให้ใส่โค้ดลงในโมดูลบนเส้นทาง python ของคุณแล้วนำเข้า สวยกว่าและอัพเกรดได้ง่ายในอนาคต
alexis

1
หรือใช้ logging.config.fileConfig ('logging.conf') และใส่การตั้งค่าทั้งหมดลงในนั้น
K. -Michael Aye

14

โปรดทราบว่า stderr เป็นสตรีมเริ่มต้นสำหรับloggingโมดูลดังนั้นในโน้ตบุ๊ก IPython และ Jupyter คุณอาจไม่เห็นอะไรเลยเว้นแต่คุณจะกำหนดค่าสตรีมเป็น stdout:

import logging
import sys

logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
                     level=logging.INFO, stream=sys.stdout)

logging.info('Hello world!')

13

สิ่งที่ใช้ได้ผลสำหรับฉันตอนนี้ (Jupyter, เซิร์ฟเวอร์โน้ตบุ๊กคือ: 5.4.1, IPython 7.0.1)

import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)

ตอนนี้ฉันสามารถใช้คนตัดไม้เพื่อพิมพ์ข้อมูลไม่เช่นนั้นฉันจะเห็นเฉพาะข้อความจากระดับเริ่มต้น ( logging.WARNING) ขึ้นไป


2
ใช่มันได้ผล หนึ่งมีการเรียกใช้basicConfig()TP ทำให้มันทำงาน
Brandt

11

คุณสามารถกำหนดค่าการบันทึกโดยการเรียกใช้ %config Application.log_level="INFO"

สำหรับข้อมูลเพิ่มเติมโปรดดูตัวเลือกเคอร์เนล IPython


1
ยินดีต้อนรับสู่ StackOverflow และขอขอบคุณสำหรับความช่วยเหลือของคุณ คุณอาจต้องการทำให้คำตอบของคุณดียิ่งขึ้นด้วยการเพิ่มคำอธิบาย
Elias MP

1
นี่เป็นคำตอบที่มีประโยชน์ที่สุดสำหรับฉันจริงๆ!
IanS

1
คุณสามารถเพิ่มสองสามบรรทัดพร้อมตัวอย่างได้หรือไม่? ที่จับคนตัดไม้เพื่อเรียกพิมพ์ข้อความบันทึกคืออะไร?
Wesam

อย่างน้อย ipython 7.9.0 (หรือ jupyter 6.0.2) ละเว้นโค้ดที่แนะนำเนื่องจากไม่รองรับคลาสนี้จากคอนโซลที่กำลังทำงานอยู่ เรียกใช้%configเพื่อดูคลาสที่รองรับApplicationไม่ใช่หนึ่งในนั้น ipython 7.9.0 ที่นี่
stason

4

ฉันตั้งค่าคนตัดไม้สำหรับทั้งสองไฟล์และฉันต้องการให้มันปรากฏบนโน้ตบุ๊ก ปรากฎว่าการเพิ่มตัวจัดการไฟล์จะล้างตัวจัดการสตรีมเริ่มต้น

logger = logging.getLogger()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Setup file handler
fhandler  = logging.FileHandler('my.log')
fhandler.setLevel(logging.DEBUG)
fhandler.setFormatter(formatter)

# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.DEBUG)
chandler.setFormatter(formatter)

# Add both handlers
logger.addHandler(fhandler)
logger.addHandler(chandler)
logger.setLevel(logging.DEBUG)

# Show the handlers
logger.handlers

# Log Something
logger.info("Test info")
logger.debug("Test debug")
logger.error("Test error")

0

ดูเหมือนว่าโซลูชันที่ใช้ได้กับ ipython / jupyter เวอร์ชันเก่าจะใช้งานไม่ได้อีกต่อไป

นี่คือโซลูชันที่ใช้งานได้สำหรับ ipython 7.9.0 (ทดสอบด้วย jupyter server 6.0.2):

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test message")

DEBUG:root:test message
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.