2012-11-20 8 views
35

Non so perché questo codice viene stampato sullo schermo, ma non sul file? Il file "esempio1.log" viene creato, ma non viene scritto nulla.Python che utilizza il metodo basicConfig per accedere alla console e al file

#!/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') 

ho "bypassato" questo problema creando un oggetto di registrazione (example code), ma mi tiene intercettazioni perché basicConfig() approccio fallito?

PS. Se cambio basicConfig chiamata a:

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

Poi tutti i registri sono nel file e nulla viene visualizzato nella console

+3

In Python 2.7, Le uniche parole chiave argomenti che basicConfig capisce sono "nomefile", "fileMode", "stream", "formato", "datefmt" e "livello". "handlers" non fa nulla. – TocToc

risposta

15

non riesco a riprodurre su Python 3.3. I messaggi vengono scritti sia sullo schermo che su 'example2.log'. Su Python < 3.3 crea il file ma è vuoto.

Il codice:

from logging_tree import printout # pip install logging_tree 
printout() 

mostra che FileHandler() non è attaccato al logger principale su Python < 3.3.

I documenti per logging.basicConfig() dicono che l'argomento handlers è stato aggiunto in Python 3.3. L'argomento handlers non è menzionato nella documentazione di Python 3.2.

+0

Hai ragione! Tuttavia, non dovrei ottenere un'eccezione quando utilizzo funzioni non supportate? È un peccato ammettere quanto tempo ho sprecato in questo ... – Jovik

+1

@Jovik: probabilmente c'è qualche logica dietro anche se non la vedo al momento. Puoi provare a segnalarlo su http://bugs.python.org – jfs

+2

[Segnalato] (http://bugs.python.org/issue16521) – Jovik

26

Prova questo bel lavoro (testato in python 2.7) sia per console e il file

# 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

Nell'esempio riportato di seguito, è possibile specificare la destinazione del log in base al suo livello. Ad esempio, il codice seguente consente a tutti i registri sul livello INFO di accedere al file di registro e tutti i livelli sopra il livello ERRORE vengono inviati alla console.

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') 
Problemi correlati