IPython Dizüstü Bilgisayardaki Günlük Modülünden Çıktı Alın


128

Aşağıdakileri IPython Notebook içinde çalıştırdığımda herhangi bir çıktı görmüyorum:

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

Defterin içindeki "test" mesajını görebilmek için nasıl yapılacağını bilen var mı?


1.0'da çalıştığına göre IPython'un hangi sürümünü kullanıyorsunuz?
Viktor Kerkez

@ViktorKerkez ipython3 notebook --versiondönüyor1.0.0
Kyle Brandt


@ViktorKerkez: Ya anlamadım, sanırım bir sorun bildirmeliyim ...
Kyle Brandt

Yanıtlar:


130

Aşağıdakileri deneyin:

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

Logging.basicConfig'e göre :

Varsayılan bir Biçimlendiriciye sahip bir StreamHandler oluşturarak ve bunu kök kaydediciye ekleyerek günlük sistemi için temel yapılandırmayı yapar. Root logger için hiçbir işleyici tanımlanmadıysa debug (), info (), warning (), error () ve crit () işlevleri, basicConfig () 'i otomatik olarak çağırır.

Kök günlükçünün kendisi için yapılandırılmış işleyicileri varsa bu işlev hiçbir şey yapmaz.

Görünüşe göre ipython notebook bir yerde basicConfig (veya set işleyicisini) çağırıyor.


4
Aynısı normal bir IPython konsolunda da olur: bir kök loggeroluşturulmadıkça hiçbir şey yazdırmaz .
Ioannis Filippidis

1
Bu çözüm 4.5'teipykernel (muhtemelen 4.4 kadar erken) tekrar çalışıyor github.com/jupyter/notebook/issues/1397
pylang

18
Bu artık çalışmıyor. Değil Jupyter Notebook 5.3.0 ile
Wesam

65

Hala kullanmak istiyorsanız basicConfig, günlük modülünü bu şekilde yeniden yükleyin

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'te bunu yapmaya çalışan herkes için: reloadşimdiimp.reload
kuzzooroo

11
Python 3.5'ten itibaren, imp modülü kullanımdan kaldırıldığı için importlib.reload'u kullanmalısınız .
Webucator

2
Herhangi biri Spyder ile günlük tutmada sorun yaşıyorsa (günlükçü davranışını değiştirmeye yönelik tüm girişimlerin başarısız olduğu), bu gün boyu süren kaz kovalamacasını sona erdirdi. github.com/spyder-ide/spyder/issues/2572 Çok teşekkürler!
FrenchKheldar

28

Anladığım kadarıyla IPython oturumu günlük kaydını başlatıyor, bu yüzden basicConfig çalışmıyor. İşte benim için işe yarayan kurulum (keşke bunu neredeyse tüm defterlerim için kullanmak istediğim için bu kadar iğrenç görünmeseydi):

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)

Şimdi koştuğumda:

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

Not defterimle aynı dizinde aşağıdakileri içeren bir "mylog.log" dosyası alıyorum:

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 oturumunu yeniden başlatmadan bunu yeniden çalıştırırsanız, artık tanımlanmış iki dosya işleyicisi olacağından dosyaya yinelenen girişler yazacağını unutmayın.


3
Bunu daha az "iğrenç görünmek" için, kodu python yolunuzdaki bir modüle yerleştirin ve içe aktarın. Gelecekte daha güzel ve yükseltmesi daha kolay.
alexis

1
Veya logging.config.fileConfig ('logging.conf') kullanın ve tüm ayarları oraya koyun.
K.-Michael Aye

14

loggingStderr'in modül için varsayılan akış olduğunu unutmayın , bu nedenle IPython ve Jupyter not defterlerinde akışı stdout olarak yapılandırmadıkça hiçbir şey göremeyebilirsiniz:

import logging
import sys

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

logging.info('Hello world!')

13

Şimdi benim için ne işe yaradı (Jupyter, dizüstü bilgisayar sunucusu: 5.4.1, IPython 7.0.1)

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

Artık bilgi yazdırmak için logger kullanabilirim, aksi takdirde yalnızca varsayılan seviyeden ( logging.WARNING) veya daha üst seviyedeki mesajları görürüm .


2
Evet, işe yarıyor. Bir sahiptir çalıştırmak için basicConfig()bu işi yapmak tp.
Brandt

11

Günlük kaydını çalıştırarak yapılandırabilirsiniz %config Application.log_level="INFO"

Daha fazla bilgi için IPython çekirdek seçeneklerine bakın


1
StackOverflow'a hoş geldiniz ve yardımınız için teşekkürler. Bazı açıklamalar ekleyerek cevabınızı daha da iyi hale getirmek isteyebilirsiniz.
Elias MP

1
Bu aslında benim için en faydalı cevaptı!
IanS

1
Bir örnekle birkaç satır ekleyebilir misiniz? Günlük mesajlarını yazdırmak için çağrılacak kaydedici tutamacı nedir?
Wesam

En azından ipython 7.9.0 (veya jupyter 6.0.2), çalışan konsolda bu sınıfı desteklemediği için önerilen kodu yok sayar. %configDesteklenenleri görmek için çalıştırın Application, onlardan biri değil. ipython 7.9.0 burada.
stason

4

Her iki dosya için de bir kaydedici kurdum ve defterde görünmesini istedim. Bir dosya işleyicisi eklemek, varsayılan akış işleyicisini temizler.

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

Görünüşe göre ipython / jupyter'in eski sürümleri için çalışan çözümler artık çalışmıyor.

İşte ipython 7.9.0 için çalışan bir çözüm (jupyter sunucusu 6.0.2 ile de test edilmiştir):

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

DEBUG:root:test message
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.