Dapatkan Output Dari Modul logging di IPython Notebook

127

Ketika saya menjalankan berikut ini di dalam Notebook IPython saya tidak melihat output apa pun:

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

Adakah yang tahu cara membuatnya sehingga saya bisa melihat pesan "test" di dalam notebook?

Kyle Brandt
sumber
Versi IPython apa yang Anda gunakan, karena ini berfungsi di 1.0?
Viktor Kerkez
@ViktorKerkez ipython3 notebook --versionkembali1.0.0
Kyle Brandt
imgur.com/1b7nGZz Saya mendapatkan ini ketika saya mencoba kode Anda.
Viktor Kerkez
@ ViktorKerkez: Ya saya tidak mengerti, saya kira saya harus mengajukan masalah ...
Kyle Brandt

Jawaban:

129

Coba ikuti:

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

Menurut logging.basicConfig :

Apakah konfigurasi dasar untuk sistem logging dengan membuat StreamHandler dengan Formatter default dan menambahkannya ke root logger. Fungsi debug (), info (), warning (), error () dan critical () akan memanggil basicConfig () secara otomatis jika tidak ada penangan yang didefinisikan untuk logger root.

Fungsi ini tidak melakukan apa-apa jika root logger sudah memiliki penangan yang dikonfigurasi untuk itu.

Sepertinya panggilan notebook ipython basicConfig (atau set handler) di suatu tempat.

falsetru
sumber
4
Hal yang sama terjadi pada konsol IPython normal: ia tidak mencetak apa pun, kecuali jika root loggerdibuat.
Ioannis Filippidis
1
Solusi ini berfungsi lagi di ipykernel4,5 (mungkin sedini 4.4) github.com/jupyter/notebook/issues/1397
pylang
17
Ini tidak berfungsi lagi. Tidak dengan Notebook Jupyter 5.3.0
Wesam
65

Jika Anda masih ingin menggunakan basicConfig, muat ulang modul logging seperti ini

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')
Marigold
sumber
16
Bagi siapa pun yang mencoba melakukan ini dalam Python 3: reloadsekarangimp.reload
kuzzooroo
11
pada Python 3.5, Anda harus menggunakan importlib.reload karena modul imp sedang ditinggalkan.
Webucator
2
Jika ada yang mengalami masalah dengan Spyder dengan logging (di mana semua upaya memodifikasi perilaku logger tidak berhasil), ini hanya mengakhiri pengejaran angsa sepanjang hari. github.com/spyder-ide/spyder/issues/2572 Terima kasih banyak!
FrenchKheldar
28

Pemahaman saya adalah bahwa sesi IPython memulai pencatatan sehingga basicConfig tidak berfungsi. Berikut ini adalah pengaturan yang berfungsi untuk saya (saya berharap ini tidak terlalu kotor karena saya ingin menggunakannya untuk hampir semua notebook saya):

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)

Sekarang ketika saya menjalankan:

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

Saya mendapatkan file "mylog.log" di direktori yang sama dengan buku catatan saya yang berisi:

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.

Perhatikan bahwa jika Anda menjalankan kembali ini tanpa memulai kembali sesi IPython itu akan menulis entri duplikat ke file karena sekarang akan ada dua penangan file yang ditentukan

skulz00
sumber
3
Untuk membuat ini "kurang terlihat kotor", masukkan kode dalam modul di jalur python Anda, dan impor. Lebih cantik dan mudah ditingkatkan di masa mendatang.
alexis
1
Atau gunakan logging.config.fileConfig ('logging.conf') dan letakkan semua setup di sana.
K.-Michael Aye
14

Ingatlah bahwa stderr adalah aliran default untuk loggingmodul, jadi di notebook IPython dan Jupyter Anda mungkin tidak melihat apa-apa kecuali Anda mengkonfigurasi stream ke stdout:

import logging
import sys

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

logging.info('Hello world!')
Ataksia
sumber
13

Apa yang bekerja untuk saya sekarang (Jupyter, server notebook adalah: 5.4.1, IPython 7.0.1)

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

Sekarang saya dapat menggunakan logger untuk mencetak info, jika tidak saya hanya akan melihat pesan dari level default ( logging.WARNING) atau lebih tinggi.

mcsim
sumber
2
Ya, itu berhasil. Kita harus menjalankannya untuk basicConfig()membuatnya bekerja.
Brandt
11

Anda dapat mengonfigurasi pencatatan dengan menjalankan %config Application.log_level="INFO"

Untuk informasi lebih lanjut, lihat opsi kernel IPython

Garvey
sumber
1
Selamat datang di StackOverflow dan terima kasih atas bantuan Anda. Anda mungkin ingin membuat jawaban Anda lebih baik dengan menambahkan beberapa penjelasan.
Elias MP
1
Ini sebenarnya jawaban yang paling berguna bagi saya!
IanS
1
Bisakah Anda menambahkan beberapa baris dengan sebuah contoh? Apa pegangan logger untuk memohon untuk mencetak pesan log?
Wesam
Setidaknya ipython 7.9.0 (atau jupyter 6.0.2) mengabaikan kode yang disarankan, karena tidak mendukung kelas ini dari konsol yang berjalan. Jalankan %configuntuk melihat classed yang didukung, Applicationbukan salah satunya. ipython 7.9.0 di sini.
stason
4

Saya menyiapkan logger untuk kedua file dan saya ingin itu muncul di notebook. Ternyata menambahkan pengolah file menghapus pengaliran aliran default.

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")
Penjara
sumber
0

Tampaknya solusi yang berfungsi untuk versi ipython / jupyter yang lebih lama tidak berfungsi lagi.

Berikut ini adalah solusi yang berfungsi untuk ipython 7.9.0 (juga diuji dengan server jupyter 6.0.2):

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

DEBUG:root:test message
Stason
sumber