2012-11-20 14 views
35

Nie wiem, dlaczego ten kod jest drukowany na ekranie, ale nie do pliku? Plik "example1.log" jest tworzony, ale nic tam nie jest zapisywane.Python za pomocą metody basicConfig do logowania do konsoli i pliku

#!/usr/bin/env python3 
import logging 

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(message)s', 
        handlers=[logging.FileHandler("example1.log"), 
           logging.StreamHandler()]) 
logging.debug('This message should go to the log file and to the console') 
logging.info('So should this') 
logging.warning('And this, too') 

ja „obejść” ten problem poprzez utworzenie obiektu rejestrowania (example code), ale to wciąż dręczy mnie dlaczego basicConfig() podejście nie powiodło?

PS. Jeśli zmienię basicConfig wywołanie:

logging.basicConfig(level=logging.DEBUG, 
        filename="example2.log", 
        format='%(asctime)s %(message)s', 
        handlers=[logging.StreamHandler()]) 

Wtedy wszystkie dzienniki są w pliku i nic nie jest wyświetlana w konsoli

+3

W Pythonie 2.7, tylko słowa kluczowe argumenty, które basicConfig rozumie to "nazwa pliku", "FileMode", "strumień", "Format", "datefmt" i "poziom". "handlery" nic nie robią. – TocToc

Odpowiedz

15

I nie można odtworzyć go w Pythonie 3.3. Komunikaty są zapisywane zarówno na ekranie, jak i na ekranie 'example2.log'. Na Pythonie < 3.3 tworzy plik, ale jest pusty.

Kod:

from logging_tree import printout # pip install logging_tree 
printout() 

pokazuje, że FileHandler() nie jest podłączony do rejestratora korzeniowego na Pythonie < 3.3.

Dokumenty dla logging.basicConfig() mówią, że argument handlers został dodany w Pythonie 3.3. Argument handlers nie jest wymieniony w dokumentacji Python 3.2.

+0

Masz rację! Jednak nie powinienem dostać wyjątek podczas korzystania z nieobsługiwanych funkcji? To wstyd przyznać, ile czasu zmarnowałem na to ... – Jovik

+1

@Jovik: Prawdopodobnie istnieje pewna logika, chociaż nie widzę tego w tej chwili. Możesz spróbować zgłosić to na http://bugs.python.org – jfs

+2

[Zgłoszono] (http://bugs.python.org/issue16521) – Jovik

26

Spróbuj pracy grzywny (testowane w Pythonie 2.7) zarówno dla konsoli i złożyć

# set up logging to file 
logging.basicConfig(
    filename='twitter_effect.log', 
    level=logging.INFO, 
    format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', 
    datefmt='%H:%M:%S' 
) 

# set up logging to console 
console = logging.StreamHandler() 
console.setLevel(logging.DEBUG) 
# set a format which is simpler for console use 
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
console.setFormatter(formatter) 
# add the handler to the root logger 
logging.getLogger('').addHandler(console) 

logger = logging.getLogger(__name__) 
4

W przykładzie poniżej, można określić miejsce docelowe dziennika na podstawie jego poziomu. Na przykład poniższy kod pozwala wszystkim dziennikom na poziomie INFO przejść do pliku dziennika, a wszystkie powyżej ERROR poziom idzie do konsoli.

import logging 
logging.root.handlers = [] 
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO , filename='ex.log') 

# set up logging to console 
console = logging.StreamHandler() 
console.setLevel(logging.ERROR) 
# set a format which is simpler for console use 
formatter = logging.Formatter('%(asctime)s : %(levelname)s : %(message)s') 
console.setFormatter(formatter) 
logging.getLogger("").addHandler(console) 

logging.debug('debug') 
logging.info('info') 
logging.warning('warning') 
logging.error('error') 
logging.exception('exp')