2011-03-17 42 views
4

在我的生产服务器上,我定期发生unicode错误,但不在我的桌面上。它出现在日志中:扭曲的Unicode异常

2011-03-17 13:14:53+0000 [GameProtocol,941,95.78.43.17] <unicode instance at 0x9e304a0 with str error: 
    Traceback (most recent call last): 
     File "/usr/local/lib/python2.6/dist-packages/twisted/python/reflect.py", line 546, in _safeFormat 
     return formatter(o) 
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-26: ordinal not in range(128) 
    > 

它不影响应用程序中的任何逻辑,但它在日志中很烦人。

服务器在Ubuntu 10.10 Server,Python 2.6.5,Twisted 10.2.0下运行。

桌面是Ubuntu 10.10桌面,Python 2.6.5,Twisted 10.2.0。

语言环境是相同的:

$ locale 
LANG=en_US.UTF-8 
LANGUAGE=en_US.UTF-8 
LC_CTYPE="en_US.UTF-8" 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER="en_US.UTF-8" 
LC_NAME="en_US.UTF-8" 
LC_ADDRESS="en_US.UTF-8" 
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8" 
LC_IDENTIFICATION="en_US.UTF-8" 
LC_ALL=en_US.UTF-8 

会是什么问题呢?

回答

5

]使用Twisted日志记录系统记录unicode是不安全的。这里是产生你看到异常的小例子:

Python 2.6.4 (r264:75706, Dec 7 2009, 18:43:55) 
[GCC 4.4.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from twisted.python import log 
>>> import sys 
>>> log.startLogging(sys.stdout) 
2011-03-17 11:03:47-0400 [-] Log opened. 
>>> log.msg(u'\N{SNOWMAN}') 
2011-03-17 11:03:53-0400 [-] <unicode instance at 140508177816384 with str error Traceback (most recent call last): 
     File "/usr/lib/python2.6/dist-packages/twisted/python/reflect.py", line 560, in safe_str 
     return str(o) 
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2603' in position 0: ordinal not in range(128) 
    > 
>>> 

所以,你需要找出Unicode是被记录什么,你希望你的日志文件,什么都路停止这样做,可能是由编码它被编码。

+1

有什么方法可以理解这个unicode日志记录来自哪里? – Soid 2011-03-17 15:34:25