在django和unicode中使用python日志时出现问题

现在完全混淆了......我正在开发python / django并使用python日志记录。 我所有的应用程序都需要unicode,我的所有模型都只有一个unicode ()`,return u'..'方法。 现在当我记录时,我遇到了一个很奇怪的问题,那就是花了很长时间才发现我可以重现它。 我已经尝试了Py 2.5.5和Py 2.6.4以及同样的东西。 所以

每当我做一些简单的日志记录就像:

logging.debug(u'new value %s' % group) 

这称为模型组。 unicode ():返回unicode(group.name)

我的unicode方法都是这样的:

def __unicode__(self):
    return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)

即使group.name是XXX或者(需要unicode),这也可以工作。 但是,当我出于某种原因想要记录一个集合,列表,字典,django-query集合和例如列表中的单个实例可能是unicode或不是我会陷入麻烦......

所以每当一个group.name需要像Luleå(我的家乡)这样的unicode时,这会给我一个UnicodeDecodingError,

logging.debug(u'new groups %s' % list_of_groups)

通常我得到这样的错误:

Exception Type:     UnicodeDecodeError
Exception Value:    ('ascii',  '<RBACInstanceRoleSet: s2 | xc3x84xc3x96xc3x96xc3x85xc3x85xc3x85 Gruppen>]', 106, 107, 'ordinal not in range(128)')

但是,如果我print list_of_groups在终端上一切都很好

所以,我的理解是,列表开始生成自己,并对其所有元素执行repr(),并返回它们的值 - 在这种情况下,它应该是's2 | ÅÄÖÖ',那么这个列表就表示为(ascii,列表中的东西),然后当试图将ascii解码为unicode时,这当然不起作用 - 因为列表中的一个元素已经被修改过了当你完成repr时,你自己就是一个'...'。

但为什么这是'

为什么事情能够正常工作,并且每当我记录诸如group.name等或group和unicode方法被调用时,unicode / ascii都可以正确处理。 每当我懒惰,想要记录一个列表,设置或其他东西坏了,只要遇到一个Unicode字符...

一些更多的例子工作和失败。 如果group.name我去模型字段和group调用__unicode__()

    logging.debug("1. group: %s " % group.name) # WORKS
    logging.debug(u"2. group: %s " % group) # WORKS
    logging.debug("3. group: %s " % group) # FAILS
    logging.debug(u"4. group: %s " % group.name) # WORKS
    logging.debug("5. group: %s " % group.name) # WORKS

...我真的认为我对Unicode有所掌握;-(


这是我的测试代码:

#-*- coding: utf-8 -*-                                      
class Wrap:                                          
    def __init__(self, s): self.s = s
    def __repr__(self): return repr(self.s)    
    def __unicode__(self): return unicode(self.s)
    def __str__(self): return str(self.s)

s = 'hello'  # a plaintext string
u = 'ÅÄÖÖ'.decode('utf-8') 
l = [s,u]
test0 = unicode(repr(l))
test1 = 'string %s' % l
test2 = u'unicode %s' % l

上面的工作很好,当你运行它。 但是,如果将repr的声明更改为:def repr (self):return unicode(self.s)

然后它会中止:

Traceback (most recent call last):
  File "mytest.py", line 13, in <module> unicode(l)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
   ordinal not in range(128)

所以它看起来像对象层次结构中的某个人有一个repr()实现,它不正确地返回unicode字符串而不是普通字符串。 正如别人提到的,当你做一个格式字符串时

'format %s' % mylist

而mylist是一个序列,python自动调用它的repr()而不是unicode()(因为没有“正确”的方式来表示一个列表为unicode字符串)。

这可能是django,这是错误的,或者你可能在你的一个模型中错误地实现了__repr__


我无法用简单的测试重现您的问题:

Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> group = u'Luleå'
>>> logging.warning('Group: %s', group)
WARNING:root:Group: Luleå
>>> logging.warning(u'Group: %s', group)
WARNING:root:Group: Luleå
>>> 

所以,正如丹尼尔所说,在你传递给日志的时候,可能有些东西不是正确的Unicode。

另外,我不知道你正在使用哪些处理程序,但要确保是否有文件处理程序明确指定了要使用的输出编码,并且如果有流处理程序,则还要包含任何需要使用编码的输出流如由codecs模块提供的封装(并将封装流传递给日志记录)。


尝试在view.py的顶部使用此代码

#-*- coding: utf-8 -*-
...
链接地址: http://www.djcxy.com/p/44135.html

上一篇: Problem when using python logging in django and unicode

下一篇: Trying to know why the OpenMP code does not parallelise