python - setlevel - importar efectos secundarios en el registro: ¿cómo restablecer el módulo de registro?
python logging configuration file example (2)
Depende de lo que el otro módulo esté haciendo; por ejemplo, si llama a logging.disable
, puede llamar a logging.disable(logging.NOTSET)
para restablecerlo.
Puedes intentar volver a cargar el módulo de logging
:
logging.shutdown()
reload(logging)
El problema es que esto dejará el módulo de terceros con su propia copia de logging
en un estado inutilizable, por lo que podría causar más problemas más adelante.
Considera este código:
import logging
print "print"
logging.error("log")
Yo obtengo:
print
ERROR:root:log
ahora si incluyo un módulo de parte de Thid al comienzo del código anterior y lo vuelvo a ejecutar, solo obtengo:
print
hay alguna pregunta previa sobre esto, pero aquí no puedo tocar el módulo que estoy importando.
El código del módulo de terceros está aquí: http://atlas-sw.cern.ch/cgi-bin/viewcvs-atlas.cgi/offline/DataManagement/DQ2/dq2.clientapi/lib/dq2/clientapi/DQ2 .py? view = markup , pero mi pregunta es más general: independientemente del módulo que estoy importando, quiero un logging
limpio que funcione de la manera esperada
Algunas soluciones propuestas (que no funcionan):
from dq2.clientapi.DQ2 import DQ2
import logging
del logging.root.handlers[:]
from dq2.clientapi.DQ2 import DQ2
import logging
logging.disable(logging.NOTSET)
logs = logging.getLogger(''root'')
logs.error("Some error")
el siguiente funciona, pero produjo algunos errores adicionales:
from dq2.clientapi.DQ2 import DQ2
import logging
reload(logging)
Yo obtengo:
print
ERROR:root:log
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43- opt/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 1509, in shutdown
h.close()
File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 705, in close
del _handlers[self]
KeyError: <logging.StreamHandler instance at 0x2aea031f7248>
Error in sys.exitfunc:
Traceback (most recent call last):
File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 1509, in shutdown
h.close()
File "/afs/cern.ch/sw/lcg/external/Python/2.6.5/x86_64-slc5-gcc43-opt/lib/python2.6/logging/__init__.py", line 705, in close
del _handlers[self]
KeyError: <logging.StreamHandler instance at 0x2aea031f7248>
from dq2.clientapi.DQ2 import DQ2
import logging
logger = logging.getLogger(__name__)
ch = logging.StreamHandler()
logger.addHandler(ch)
logger.error("log")
Para borrar por completo la configuración de registro existente del registrador de raíz, esto podría funcionar:
root = logging.getLogger()
map(root.removeHandler, root.handlers[:])
map(root.removeFilter, root.filters[:])
Sin embargo, esto no se restablece al "valor predeterminado", esto borra todo. StreamHandler
agregar un StreamHandler
para lograr lo que desea.