2011-03-17 47 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