瀏覽代碼

Use traceback.format_exc and log instead of traceback.print_exc()

Mike Naberezny 10 年之前
父節點
當前提交
cf883c0eb8
共有 3 個文件被更改,包括 12 次插入9 次删除
  1. 2 1
      supervisor/http.py
  2. 6 5
      supervisor/tests/test_xmlrpc.py
  3. 4 3
      supervisor/xmlrpc.py

+ 2 - 1
supervisor/http.py

@@ -823,7 +823,8 @@ def make_http_servers(options, supervisord):
             try:
             try:
                 inst = factory(supervisord, **d)
                 inst = factory(supervisord, **d)
             except:
             except:
-                import traceback; traceback.print_exc()
+                tb = traceback.format_exc()
+                options.logger.warn(tb)
                 raise ValueError('Could not make %s rpc interface' % name)
                 raise ValueError('Could not make %s rpc interface' % name)
             subinterfaces.append((name, inst))
             subinterfaces.append((name, inst))
             options.logger.info('RPC interface %r initialized' % name)
             options.logger.info('RPC interface %r initialized' % name)

+ 6 - 5
supervisor/tests/test_xmlrpc.py

@@ -435,14 +435,15 @@ class TestDeferredXMLRPCResponse(unittest.TestCase):
             raise ValueError('foo')
             raise ValueError('foo')
         callback.delay = 1
         callback.delay = 1
         inst = self._makeOne(callback=callback)
         inst = self._makeOne(callback=callback)
-        inst.traceback = Dummy()
-        called = []
-        inst.traceback.print_exc = lambda: called.append(True)
         self.assertEqual(inst.more(), None)
         self.assertEqual(inst.more(), None)
         self.assertEqual(inst.request._error, 500)
         self.assertEqual(inst.request._error, 500)
         self.assertTrue(inst.finished)
         self.assertTrue(inst.finished)
-        self.assertTrue(called)
-        
+        logged = inst.request.channel.server.logger.logged
+        self.assertEqual(len(logged), 1)
+        src, msg = logged[0]
+        self.assertEqual(src, 'XML-RPC response callback error')
+        self.assertTrue("Traceback" in msg)
+
 class DummyResponse:
 class DummyResponse:
     def __init__(self, status=200, body='', reason='reason'):
     def __init__(self, status=200, body='', reason='reason'):
         self.status = status
         self.status = status

+ 4 - 3
supervisor/xmlrpc.py

@@ -51,7 +51,6 @@ class DeferredXMLRPCResponse:
     """ A medusa producer that implements a deferred callback; requires
     """ A medusa producer that implements a deferred callback; requires
     a subclass of asynchat.async_chat that handles NOT_DONE_YET sentinel """
     a subclass of asynchat.async_chat that handles NOT_DONE_YET sentinel """
     CONNECTION = re.compile ('Connection: (.*)', re.IGNORECASE)
     CONNECTION = re.compile ('Connection: (.*)', re.IGNORECASE)
-    traceback = traceback # for testing override
 
 
     def __init__(self, request, callback):
     def __init__(self, request, callback):
         self.callback = callback
         self.callback = callback
@@ -77,8 +76,10 @@ class DeferredXMLRPCResponse:
             return self.getresponse(body)
             return self.getresponse(body)
 
 
         except:
         except:
-            # report unexpected exception back to server
-            self.traceback.print_exc()
+            tb = traceback.format_exc()
+            self.request.channel.server.logger.log(
+                "XML-RPC response callback error", tb
+                )
             self.finished = True
             self.finished = True
             self.request.error(500)
             self.request.error(500)