2014-04-02 54 views
1

很長一段時間,我不得不努力解決「UnicodeDecodeError:ascii編解碼器無法解碼...」錯誤,而save()模型,直到我「意外」設置settings.DEBUG = False。然後我意識到Unicode異常不是來自我的數據,也不是來自我的代碼,而是來自Django的SQL日誌記錄,這顯然是在ascii中。Django SQL日誌記錄爲UTF-8:避免UnicodeDecodeError while settings.DEBUG = True

問題是,有沒有簡單的方法將日誌記錄從ascii轉換爲utf-8,這樣我仍然可以利用日誌記錄功能而不處理異常?

非常感謝! =)

+0

如何使用自定義記錄器類?請參閱:http://stackoverflow.com/a/44009835/3015186 – np8

回答

0

我發現了一個似乎暫時工作的黑客。在Django/DB /後端/ util.py:

class CursorDebugWrapper(CursorWrapper): 

    # XXX callproc isn't instrumented at this time. 

    def execute(self, sql, params=None): 
     start = time() 
     try: 
      return super(CursorDebugWrapper, self).execute(sql, params) 
     finally: 
      stop = time() 
      duration = stop - start 
      sql = self.db.ops.last_executed_query(self.cursor, sql, params) 
      self.db.queries.append({ 
       'sql': sql, 
       'time': "%.3f" % duration, 
      }) 
      logger.debug('(%.3f) %s; args=%s' % (duration, sql, params), 
       extra={'duration': duration, 'sql': sql, 'params': params} 
      ) 

我改變最後一行:

  logger.debug('(%.3f) %s; args=%s' % (duration, sql.decode('utf-8'), params), 
       extra={'duration': duration, 'sql': sql, 'params': params} 
      ) 

將是巨大的,如果有人可以提供更好/更優雅的解決方案。