Bläddra i källkod

Set default encoding file from logger handler. Closes #427

Ask Solem 11 år sedan
förälder
incheckning
31b571741f
2 ändrade filer med 15 tillägg och 5 borttagningar
  1. 8 0
      celery/app/log.py
  2. 7 5
      celery/utils/log.py

+ 8 - 0
celery/app/log.py

@@ -19,6 +19,7 @@ import sys
 from logging.handlers import WatchedFileHandler
 
 from kombu.log import NullHandler
+from kombu.utils.encoding import set_default_encoding_file
 
 from celery import signals
 from celery._state import get_current_task
@@ -128,6 +129,13 @@ class Logging(object):
             # then setup the root task logger.
             self.setup_task_loggers(loglevel, logfile, colorize=colorize)
 
+        try:
+            stream = root.handlers[0].stream
+        except (AttributeError, IndexError):
+            pass
+        else:
+            set_default_encoding_file(stream)
+
         # This is a hack for multiprocessing's fork+exec, so that
         # logging before Process.run works.
         logfile_name = logfile if isinstance(logfile, string_t) else ''

+ 7 - 5
celery/utils/log.py

@@ -17,10 +17,10 @@ import traceback
 from contextlib import contextmanager
 from billiard import current_process, util as mputil
 from kombu.log import get_logger as _get_logger, LOG_LEVELS
+from kombu.utils.encoding import safe_str
 
-from celery.five import string_t
+from celery.five import string_t, text_t
 
-from .encoding import safe_str
 from .term import colored
 
 __all__ = ['ColorFormatter', 'LoggingProxy', 'base_logger',
@@ -116,6 +116,7 @@ class ColorFormatter(logging.Formatter):
         return r
 
     def format(self, record):
+        sformat = logging.Formatter.format
         color = self.colors.get(record.levelname)
 
         if color and self.use_color:
@@ -127,7 +128,7 @@ class ColorFormatter(logging.Formatter):
                 # Issue #427
                 try:
                     if isinstance(msg, string_t):
-                        record.msg = safe_str(color(safe_str(msg)))
+                        record.msg = text_t(color(safe_str(msg)))
                     else:
                         record.msg = safe_str(color(msg))
                 except UnicodeDecodeError:
@@ -136,8 +137,9 @@ class ColorFormatter(logging.Formatter):
                 record.msg = '<Unrepresentable {0!r}: {1!r}>'.format(
                     type(msg), exc)
                 record.exc_info = True
-
-        return safe_str(logging.Formatter.format(self, record))
+            return sformat(self, record)
+        else:
+            return safe_str(sformat(self, record))
 
 
 class LoggingProxy(object):