2012-03-02 20 views
11

Tôi có một thử nghiệm python mà tôi muốn kiểm tra xem quá trình ghi có hoạt động đúng hay không. Ví dụ tôi có một chức năng tạo ra một người dùng và ở phần cuối, việc ghi nhật ký ghi vào tệp nhật ký phản hồi.Ghi nhật ký Python vào trình xử lý StringIO

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

Trong trường hợp thử nghiệm của tôi, tôi muốn gửi đầu ra bản ghi tới 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() 

Vấn đề là tôi không chắc chắn làm cách nào để kiểm tra bộ lọc hoặc bộ ghi nhật ký của tôi đang hoạt động.

+1

Xin lỗi, đây có thể chỉ là ngoài tôi, nhưng bạn sẽ không chỉ làm 'stream.getvalue()'? – macduff

+0

liên quan: [PyDev unittesting: Cách ghi lại văn bản đã đăng nhập vào nhật ký ghi dữ liệu.Logger in "Captured Output"] (http://stackoverflow.com/q/7472863/321973) –

Trả lời

18

Dưới đây là ví dụ hoạt động, đảm bảo bạn đặt mức nhật ký của mình và xóa bộ đệm.

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.assertTrue(self.stream.getvalue(), 'test') 

    def tearDown(self): 
     self.log.removeHandler(self.handler) 
     self.handler.close() 

if __name__=='__main__': 
    unittest.main() 

Đọc thêm, đây là ví dụ Temporily Capturing Python Logging to a string buffer cho biết cách bạn cũng có thể định dạng.