Nhận đầu ra từ mô đun đăng nhập trong IPython Notebook


127

Khi tôi chạy phần bên trong IPython Notebook, tôi không thấy bất kỳ đầu ra nào:

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

Bất cứ ai cũng biết làm thế nào để tôi có thể thấy thông báo "kiểm tra" bên trong sổ ghi chép?


Bạn đang sử dụng phiên bản IPython nào, vì phiên bản này hoạt động trong 1.0?
Viktor Kerkez

@ViktorKerkez ipython3 notebook --versiontrở lại1.0.0
Kyle Brandt

imgur.com/1b7nGZz Tôi nhận được điều này khi tôi thử mã của bạn.
Viktor Kerkez

@ViktorKerkez: Tôi không hiểu điều đó, đoán tôi nên nộp một vấn đề ...
Kyle Brandt

Câu trả lời:


129

Hãy thử làm theo:

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

Theo log.basicConfig :

Có cấu hình cơ bản cho hệ thống ghi nhật ký bằng cách tạo StreamHandler với Trình định dạng mặc định và thêm nó vào trình ghi nhật ký gốc. Các hàm gỡ lỗi (), thông tin (), cảnh báo (), lỗi () và quan trọng () sẽ tự động gọi basicConfig () nếu không có trình xử lý nào được xác định cho trình ghi nhật ký gốc.

Hàm này không làm gì nếu logger gốc đã có các trình xử lý được cấu hình cho nó.

Có vẻ như máy tính xách tay ipython gọi basicConfig (hoặc đặt trình xử lý) ở đâu đó.


4
Điều tương tự cũng xảy ra trong bảng điều khiển IPython bình thường: nó không in bất cứ thứ gì, trừ khi một root loggerđược tạo.
Ioannis Filippidis

1
Giải pháp này hoạt động trở lại trong ipykernel4,5 (có thể sớm nhất là 4,4) github.com/jupyter/notebook/issues/1394
pylang

17
Điều này không hoạt động nữa. Không phải với Notebook Jupyter 5.3.0
Wesam

64

Nếu bạn vẫn muốn sử dụng basicConfig, hãy tải lại mô-đun đăng nhập như thế này

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
Đối với bất cứ ai đang cố gắng làm điều này trong Python 3: reloadbây giờimp.reload
kuzzooroo

11
kể từ Python 3.5, bạn nên sử dụng importlib.reload vì mô-đun imp đang bị phản đối.
Webucator

2
Nếu bất cứ ai gặp rắc rối với Spyder với việc đăng nhập (trong đó mọi nỗ lực sửa đổi hành vi logger đều không thành công), thì điều này chỉ chấm dứt một cuộc rượt đuổi kéo dài cả ngày. github.com/spyder-ide/spyder/issues/2572 Cảm ơn rất nhiều!
FrenchKainedar

27

Tôi hiểu rằng phiên IPython bắt đầu đăng nhập nên basicConfig không hoạt động. Đây là thiết lập phù hợp với tôi (tôi ước nó không quá thô thiển vì tôi muốn sử dụng nó cho hầu hết các sổ ghi chép của mình):

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)

Bây giờ khi tôi chạy:

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

Tôi nhận được tệp "mylog.log" trong cùng thư mục với sổ ghi chép có chứa:

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.

Lưu ý rằng nếu bạn chạy lại cái này mà không khởi động lại phiên IPython, nó sẽ ghi các mục trùng lặp vào tệp vì bây giờ sẽ có hai trình xử lý tệp được xác định


3
Để làm cho điều này bớt "thô thiển", hãy đặt mã vào một mô-đun trên đường dẫn python của bạn và nhập nó. Đẹp hơn và dễ dàng để nâng cấp trong tương lai.
alexis

1
Hoặc sử dụng log.config.fileConfig ('log.conf') và đặt tất cả thiết lập vào đó.
K.-Michael Aye

14

Hãy nhớ rằng stderr là luồng mặc định cho loggingmô-đun, vì vậy trong sổ ghi chép IPython và Jupyter bạn có thể không thấy bất cứ điều gì trừ khi bạn định cấu hình luồng thành thiết bị xuất chuẩn:

import logging
import sys

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

logging.info('Hello world!')

13

Những gì làm việc cho tôi bây giờ (Jupyter, máy chủ máy tính xách tay là: 5.4.1, IPython 7.0.1)

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

Bây giờ tôi có thể sử dụng logger để in thông tin, nếu không tôi sẽ chỉ thấy thông báo từ mức mặc định ( logging.WARNING) trở lên.


2
Vâng, nó hoạt động. Người ta phải chạy basicConfig()tp làm cho nó hoạt động.
Brandt

11

Bạn có thể định cấu hình đăng nhập bằng cách chạy %config Application.log_level="INFO"

Để biết thêm thông tin, hãy xem tùy chọn nhân IPython


1
Chào mừng bạn đến với StackOverflow và cảm ơn sự giúp đỡ của bạn. Bạn có thể muốn làm cho câu trả lời của bạn thậm chí tốt hơn bằng cách thêm một số lời giải thích.
Elias MP

1
Đây thực sự là câu trả lời hữu ích nhất cho tôi!
IanS

1
Bạn có thể thêm một vài dòng với một ví dụ? Xử lý logger để gọi để in thông điệp tường trình là gì?
Wesam

Ít nhất ipython 7.9.0 (hoặc jupyter 6.0.2) bỏ qua mã được đề xuất, vì nó không hỗ trợ lớp này từ bảng điều khiển đang chạy. Chạy %configđể xem các lớp được hỗ trợ, Applicationkhông phải là một trong số họ. ipython 7.9.0 tại đây.
stason

4

Tôi thiết lập một logger cho cả hai tập tin và tôi muốn nó hiển thị trên notebook. Hóa ra việc thêm một trình xử lý tệp sẽ xóa trình xử lý luồng mặc định.

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

Có vẻ như các giải pháp hoạt động cho các phiên bản cũ hơn của ipython / jupyter không còn hoạt động.

Đây là một giải pháp hoạt động cho ipython 7.9.0 (cũng đã được thử nghiệm với máy chủ jupyter 6.0.2):

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

DEBUG:root:test message
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.