diff --git a/src/ZEO/zrpc/log.py b/src/ZEO/zrpc/log.py
index 8f9fd289c49eeb307bd5cb8e0ec07d1c13c0ec1a..f7860fd9a0a59eebc01a027b1e27651538f72be5 100644
--- a/src/ZEO/zrpc/log.py
+++ b/src/ZEO/zrpc/log.py
@@ -14,6 +14,9 @@
 import os
 import types
 import zLOG
+import threading
+
+LOG_THREAD_ID = 0 # Set this to 1 during heavy debugging
 
 _label = "zrpc:%s" % os.getpid()
 
@@ -22,7 +25,10 @@ def new_label():
     _label = "zrpc:%s" % os.getpid()
 
 def log(message, level=zLOG.BLATHER, label=None, error=None):
-    zLOG.LOG(label or _label, level, message, error=error)
+    label = label or _label
+    if LOG_THREAD_ID:
+        label = "%s:%s" % (label, threading.currentThread().getName())
+    zLOG.LOG(label, level, message, error=error)
 
 REPR_LIMIT = 40
 
@@ -40,7 +46,13 @@ def short_repr(obj):
     # module name in the pickle.
 
     if isinstance(obj, types.StringType):
-        r = `obj[:REPR_LIMIT]`
+        if len(obj) > REPR_LIMIT:
+            r = repr(obj[:REPR_LIMIT])
+        else:
+            r = repr(obj)
+        if len(r) > REPR_LIMIT:
+            r = r[:REPR_LIMIT-4] + '...' + r[-1]
+        return r
     elif isinstance(obj, types.TupleType):
         elts = []
         size = 0