2012-06-21 13 views
5

¿Cómo puedo hacer un registrador mundial para que pueda utilizarlo en todos los módulos que hago?Python registro global

Algo como esto en moduleA:

import logging 
import moduleB 

log = logging.getLogger('') 

result = moduleB.goFigure(5) 
log.info('Answer was', result) 

Con esto en moduleB:

def goFigure(integer): 
    if not isinstance(integer, int): 
     log.critical('not an integer') 
    else: 
     return integer + 1 

Actualmente, obtendrá un error porque moduleB no sabe lo que es log. ¿Cómo puedo evitar eso?

Respuesta

17

Usted puede hacer su propio registro de "módulo", que crea una instancia del registrador, que tiene todos sus importaciones código que en su lugar. Piense:

logger.py:

import logging 
log = logging.getLogger('') 

codeA.py:

from logger import log 
log.info('whatever') 

codeB.py:

from logger import log 
log.warn('some other thing') 
+0

muchas gracias – MFB

+0

Esta solución funcionó como un encanto, incluso con la configuración del registrador personalizado. – Centurion

2

Un módulo tiene por defecto sólo el acceso a builtin functions y builtin constants. Para todas las demás variables, funciones ... debe usar la palabra clave import.

ya por su ejemplo concreto, puede importar el log -Variable de moduleA en modulesB así:

from moduleA import log 

La siguiente sería equivalente debido a que el logging -module devuelve la misma instancia del registrador que era vuelto a moduleA:

import logging 
log = logging.getLogger('') 

Otra solución para usted podría ser utilizar el valor por defecto-registrador del módulo logging como Thi s:

logging.info("Hello") 
+0

muchas gracias – MFB

2

Creación de un registrador global que se puede utilizar para

  1. crear un nuevo archivo de registro o
  2. vuelve registrador para un archivo de registro global.

Crear un módulo llamado llamada myLogger.py: Esto tendrá el código de creación del registro

myLogger.py:

import logging 

def myLog(name, fname = 'myGlobalLog.log'): 
'''Debug Log'''                         
    logger = logging.getLogger(name);                    
    logger.setLevel(logging.DEBUG)                     
    fhan = logging.FileHandler(fname)                    
    fhan.setLevel(logging.DEBUG)                      
    logger.addHandler(fhan)                       
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')       
    fhan.setFormatter(formatter) 
    '''comment this to enable requests logger'''                  
    #logger.disabled = True 
    return logger 

Ahora para crear un nuevo registro en el módulo dicen que una .py

from myLogger import myLog 
log = myLog(__name__, 'newLog.log') 
log.debug("In new log file") 

Por lo tanto, debe pasar el nombre del archivo junto con el logger.

Para utilizar el registrador global en A.py:

from myLogger import myLog 
log = myLog(__name__) 
log.debug("In myGlobalLog file") 

No necesita pasar el nombre del archivo en este caso, ya que usaremos el registro global.