2011-07-11 12 views

Respuesta

12

Como se ha mencionado, los manipuladores son tan fáciles de crear y añaden que probablemente sea mejor que solo use dos manipuladores. Sin embargo, si por alguna razón quiere apegarse a uno, el Python logging cookbook tiene una sección que describe más o menos lo que quiere hacer: iniciar sesión tanto en la consola como en el archivo, pero en diferentes niveles (incluso le muestra cómo hacer diferentes formatos)) Lo hace con una sola StreamHandler en lugar de un FileHandler, sin embargo:

import logging 

# set up logging to file - see previous section for more details 
logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        datefmt='%m-%d %H:%M', 
        filename='/temp/myapp.log', 
        filemode='w') 
# define a Handler which writes INFO messages or higher to the sys.stderr 
console = logging.StreamHandler() 
console.setLevel(logging.INFO) 
# set a format which is simpler for console use 
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
# tell the handler to use this format 
console.setFormatter(formatter) 
# add the handler to the root logger 
logging.getLogger('').addHandler(console) 

# Now, we can log to the root logger, or any other logger. First the root... 
logging.info('Jackdaws love my big sphinx of quartz.') 

# Now, define a couple of other loggers which might represent areas in your 
# application: 

logger1 = logging.getLogger('myapp.area1') 
logger2 = logging.getLogger('myapp.area2') 

logger1.debug('Quick zephyrs blow, vexing daft Jim.') 
logger1.info('How quickly daft jumping zebras vex.') 
logger2.warning('Jail zesty vixen who grabbed pay from quack.') 
logger2.error('The five boxing wizards jump quickly.') 

Editar: Como se discutió en los comentarios de este código sigue generando dos manipuladores, pero "oculta" una construcción a través de la utilización de basicConfig() . Le recomiendo encarecidamente que cree ambos explícitamente.

+0

Esto sigue siendo dos controladores. Solo "enmascaró" la creación de 'FileHandler' con' basicConfig (...) ', prefiero crearlos de forma explícita. – plundra

+0

Tienes razón, por supuesto. Sin embargo, asumí que esto (o algo similar) es lo que el asker tenía en mente cuando dijo que estaba enviando a dos lugares con un solo registrador. También tengo que estar de acuerdo con usted en su otro punto: es mucho más claro y más ordenado declarar explícitamente a ambos controladores IMO. – bdeniker

2

No. La salida de archivo y pantalla significa que necesita dos manejadores.

+0

Con un solo controlador, actualmente está escribiendo tanto en el archivo como en la pantalla. Pero ambos en el mismo nivel (logging.DEBUG). – cssndrx

+0

@cssndrx: "un controlador, actualmente está escribiendo tanto en el archivo como en la pantalla". Encuentro eso difícil de entender. ** Actualice ** la pregunta para incluir la configuración de registro que está utilizando para que esto suceda. –

+0

@eryksun: muchas cosas "se puede hacer". Necesitamos ver qué están ** realmente ** haciendo. –

Cuestiones relacionadas