Python logging to StringIO handler

Tengo una prueba de python en la que quiero probar si el registro funciona correctamente. Por ejemplo, tengo una función que crea un usuario y al final el registro escribe en el archivo de registro la respuesta.

logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) handler = logging.handlers.WatchedFileHandler('mylogfile.log') formatter = logging.Formatter('%(asctime)s: %(message)s', '%d/%b/%Y:%H:%M:%S %z') handler.setFormatter(formatter) logger.addHandler(handler) logger.info('Some log text') 

En mi caso de prueba quiero enviar la salida del registro a StringIO.

 class MyTest(unittest.TestCase): def setUp(self): stream = StringIO() self.handler = logging.StreamHandler(stream) log = logging.getLogger('mylogger') log.removeHandler(log.handlers[0]) log.addHandler(self.handler) def tearDown(self): log = logging.getLogger('mylogger') log.removeHandler(self.handler) self.handler.close() 

El problema es que no estoy seguro de cómo debo probar si funciona o no mi registrador.

Este es un ejemplo que funciona, asegúrese de establecer el nivel de su registro y vaciar el búfer.

 class MyTest(unittest.TestCase): def setUp(self): self.stream = StringIO() self.handler = logging.StreamHandler(self.stream) self.log = logging.getLogger('mylogger') self.log.setLevel(logging.INFO) for handler in self.log.handlers: self.log.removeHandler(handler) self.log.addHandler(self.handler) def testLog(self): self.log.info("test") self.handler.flush() print '[', self.stream.getvalue(), ']' self.assertEqual(self.stream.getvalue(), 'test') def tearDown(self): self.log.removeHandler(self.handler) self.handler.close() if __name__=='__main__': unittest.main() 

Para leer más, aquí hay un ejemplo que captura temporalmente el registro de Python en un búfer de cadena que muestra cómo también podría hacer el formateo.