瀏覽代碼

Logging should now handle utf8 correctly

David Cramer 15 年之前
父節點
當前提交
5523ddadd1
共有 2 個文件被更改,包括 22 次插入3 次删除
  1. 12 2
      celery/log.py
  2. 10 1
      celery/worker/job.py

+ 12 - 2
celery/log.py

@@ -5,6 +5,7 @@ import time
 import os
 import sys
 import traceback
+import types
 
 from multiprocessing import current_process
 from multiprocessing import util as mputil
@@ -33,18 +34,27 @@ class ColorFormatter(logging.Formatter):
         logging.Formatter.__init__(self, msg)
         self.use_color = use_color
 
+    def formatException(self, ei):
+        r = logging.Formatter.formatException(self, ei)
+        if type(r) in [types.StringType]:
+            r = r.decode('utf-8', 'replace') # Convert to unicode
+        return r
+
     def format(self, record):
         levelname = record.levelname
 
         if self.use_color and levelname in COLORS:
-            record.msg = str(colored().names[COLORS[levelname]](record.msg))
+            record.msg = unicode(colored().names[COLORS[levelname]](record.msg))
 
         # Very ugly, but have to make sure processName is supported
         # by foreign logger instances.
         # (processName is always supported by Python 2.7)
         if "processName" not in record.__dict__:
             record.__dict__["processName"] = current_process()._name
-        return logging.Formatter.format(self, record)
+        t = logging.Formatter.format(self, record)
+        if type(t) in [types.UnicodeType]:
+            t = t.encode('utf-8', 'replace')
+        return t
 
 
 def get_task_logger(loglevel=None, name=None):

+ 10 - 1
celery/worker/job.py

@@ -473,7 +473,16 @@ class TaskRequest(object):
                    "traceback": unicode(exc_info.traceback, 'utf-8'),
                    "args": self.args,
                    "kwargs": self.kwargs}
-        self.logger.error(self.error_msg.strip() % context, exc_info=exc_info)
+
+        self.logger.error(self.error_msg.strip() % context,
+                          exc_info=exc_info,
+                          extra={
+                              "data": {
+                                  "hostname": self.hostname,
+                                  "id": self.task_id,
+                                  "name": self.task_name,
+                              }
+                          })
 
         task_obj = tasks.get(self.task_name, object)
         self.send_error_email(task_obj, context, exc_info.exception,