2014-06-17 11 views
7

Der folgende Code druckt "Ich möchte das zu drucken" in "Ipython Qtconsole" aber es wird nicht in normalem IPython gedruckt.Protokollierungsmodul druckt nicht in IPython

import logging 
import logging.handlers 

log = logging.getLogger() 
f = logging.Formatter("%(asctime)s - %(module)s. %(funcName)s - %(levelname)s - %(message)s") 
fh = logging.handlers.TimedRotatingFileHandler('log.txt', 'W6') 
fh.setFormatter(f) 
log.addHandler(fh) 
log.setLevel(logging.INFO) 
log.info('I want this to print') 

In ‚IPython qtconsole‘ jedoch bekomme ich verschiedene Probleme, dass ich here zu erklären versucht (was nicht so gut gelaufen ist, keine Notwendigkeit zu lesen!).

Können Sie mir bitte sagen, warum?

EDIT: Ich verwende Python 2.7

EDIT2: Vielleicht logging.StreamHandler hinzufügen muss ich wirklich nur.

+0

welche Version von Python? –

+0

Sie setzen einen * file * -Handler, so dass die Ausgabe in die Datei 'log.txt' geht. Ich weiß nicht, warum Sie denken, dass die Konsole auf stdout ausgeben sollte ... – Bakuriu

+0

Das funktioniert für mich: Ich bekomme Zeilen wie "2014-06-17 11: 39: 29.422 - . - INFO - Ich möchte dies in log.txt drucken. – Evert

Antwort

18

Es scheint wie qtconsole einen Handler zum root Logger fügt hinzu:

In [1]: import logging 
    ...: root = logging.getLogger() 
    ...: root.handlers 
    ...: 
Out[1]: [<logging.StreamHandler at 0x7fd8e00e1f98>] 

Während die normale Python-Interpreter oder nur ipython:

In [1]: import logging 

In [2]: root = logging.getLogger() 

In [3]: root.handlers 
Out[3]: [] 

Wenn Sie beide das gleiche verhalten wollen, sollten Sie Fügen Sie entweder einen StreamHandler zum Stammlogger für den normalen ipython hinzu, oder entfernen Sie den StreamHandler vom Interpreter von qtconsole.

Wenn Sie die ehemalige wollen nur hinzufügen:

root = logging.getLogger() 
root.addHandler(logging.StreamHandler()) 

Wenn Sie letztere wollen, vor geben Sie Ihre eigenen Handler tun:

for handler in root.handlers[:]: 
    root.removeHandler(handler) 

Beachten Sie, dass IPython bietet bereits einige Maschinen für die Protokollierung in eine Datei. Siehe the documentation. Wenn Sie den Code nur innerhalb von ipython mit seinen magics verwenden möchten, könnte einfacher sein.

+0

Vielen Dank !!! – HeinzKurt

+0

Wenn Sie die letztere Lösung verwenden, wird es nicht ordnungsgemäß funktionieren, wenn root mehr als einen Handler hat, weil Probleme während des Iterierens entfernt werden. stattdessen Verwendung: '' ' während len (root.handlers): root.removeHandler (root.handlers [0]) ' '' –

+4

@ RonanPaixão sorgfältig lesen Sie den Code ein. Ich glaube, du hast 3 Charaktere verpasst, die einen Unterschied machen und das Verhalten verhindern, das du beschreibst. – Bakuriu

1

Wenn Sie Bakurius letztgenannte Lösung verwenden, wird es nicht ordnungsgemäß funktionieren, wenn root mehr als einen Handler hat, weil Probleme während des Iterierens beseitigt werden.

Verwenden statt:

while len(root.handlers): 
    root.removeHandler(root.handlers[0]) 
+0

Bakurius Antwort hat nicht das Problem, das Sie beschreiben, dank der Verwendung von '[:]' (die 3 Zeichen in seiner Antwort auf Ihren Kommentar erwähnt). Ihre Lösung funktioniert jedoch auch. – rob3c

2

was

für mich gearbeitet

Import Logger vor jedem anderen Bibliothek/Code in separater Zelle. Das ist eigentlich die Hauptanforderung. Wenn ich die Protokollierung und andere Bibliotheken in einer Zelle zu laden, egal, welche Hierarchie in dieser Zelle ist, Protokollierung funktioniert nicht

import logging 
reload(logging) 
logger = logging.getLogger(__name__) 

nur nach dem Laden Bibliotheken I Konfig.satz Protokollierung Drucken pyspark Last Debug zu vermeiden

logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', 
        level=logging.INFO, 
        datefmt='%I:%M:%S') 
+0

Ich starte Spyder3 von einer Python 2.7 Conda-Umgebung und dies löste es für mich. Vielen Dank! – Disco4Ever