Python日志和日语(或任何非科学的)

2024-05-16 22:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在将一个遗留的Django项目(基于Django 1.1)本地化为日语后,当locale为日语时,一些日志(不是所有日志)输出如下内容:

Traceback (most recent call last):
  File "/home/deploy/.pythonbrew/pythons/Python-2.7/lib/python2.7/logging/__init__.py", line 838, in emit
    msg = self.format(record)
  File "/home/deploy/.pythonbrew/pythons/Python-2.7/lib/python2.7/logging/__init__.py", line 715, in format
    return fmt.format(record)
  File "/home/deploy/.pythonbrew/pythons/Python-2.7/lib/python2.7/logging/__init__.py", line 467, in format
    s = self._fmt % record.__dict__
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

这是什么原因造成的?有没有简单的方法可以绕过它?如果没有,我如何更仔细地调查这个问题,因为我甚至不知道哪些行调用失败的日志?提前谢谢。在


Tags: djangoinpyselfformathomeinitlib
2条回答

为了避免这种异常,我在each.py的顶部写下这行:

# This Python file uses the following encoding: utf-8

来自PEP

  1. Without interpreter line, using plain text:

      # This Python file uses the following encoding: utf-8
      import os, sys
      ...
    

找到字符串的方法是编辑日志模块以提供有关错误的一些信息。你不必保留编辑,只要修改足够长的时间就可以找出问题的起因。在

例如,在“/home/deploy/.pythonbrew/pythons/Python-2.7/lib/python2.7/logging/\uu init_uu.py”处,第467行是这样一行:

s = self._fmt % record.__dict__

更改为:

^{pr2}$

然后当UnicodeDecodeError发生时,您将被放入调试器。您可以检查格式字符串和记录以确定问题所在。在

不过,这可能过于劳动密集,所以另一个选择是:

try:
    s = self._fmt % record.__dict__
except UnicodeError:
    s = "*** Couldn't log properly: %r against %r" % (self._fmt, record.__dict__)

这样,日志将包含一行,指示失败的数据,每个失败的日志行都有一行。如果随后检查日志文件,可能会发现许多问题行。在

别忘了保留logging/\uuu init_uu.py文件的原始版本,这样在调试完成后可以恢复到它。在

这个问题的难点在于,代码中可能会有很多有问题的代码行,而且你不能用像这样的即席技术把它们全部抓到,除非你有100%的代码覆盖率,并且可以保证在测试期间命中所有这些行。在

有关Python中Unicode的基本问题的更多信息,请参见Pragmatic Unicode, or, How Do I Stop The Pain?。在

相关问题 更多 >