Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python日志和日语(或任何非ascii)_Python_Django_Logging_Encoding_Utf 8 - Fatal编程技术网

Python日志和日语(或任何非ascii)

Python日志和日语(或任何非ascii),python,django,logging,encoding,utf-8,Python,Django,Logging,Encoding,Utf 8,将一个遗留Django项目(基于Django 1.1)本地化为日语后,当语言环境为日语时,一些日志(并非所有日志)输出如下内容: 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/

将一个遗留Django项目(基于Django 1.1)本地化为日语后,当语言环境为日语时,一些日志(并非所有日志)输出如下内容:

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)

造成这种情况的原因是什么?有没有简单的方法可以避免这种情况?如果没有,我怎么能更仔细地调查这个问题,因为我甚至不知道哪行调用失败日志?提前感谢。

找到字符串的方法是编辑日志模块,为您提供有关错误的信息。您不必保留编辑,只需修改它们足够长的时间,以找出问题的原因

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

s = self._fmt % record.__dict__
将其更改为:

try:
    s = self._fmt % record.__dict__
except UnicodeError:
    import pdb
    pdb.set_trace()
然后,当UnicodeDecodeError发生时,您将被放入调试器。您可以检查格式字符串和记录以确定问题所在

但这可能过于劳动密集,因此另一种选择是:

try:
    s = self._fmt % record.__dict__
except UnicodeError:
    s = "*** Couldn't log properly: %r against %r" % (self._fmt, record.__dict__)
这样,日志将包含一行,指示失败的数据,并且每个失败的日志行都有一行。如果随后检查日志文件,可能会发现许多问题行

别忘了保留logging/\uuu init\uuuuu.py文件的原始版本,以便在调试完成后可以恢复到该文件

这个问题的困难之处在于,可能会有许多令人不快的行,散布在代码中,并且您无法使用像这样的特殊技术将它们全部捕获,除非您有100%的代码覆盖率,并且可以保证在测试期间命中所有行


有关Python中Unicode的基本问题的更多信息,请参见。

为了避免此类异常,我在每个.py的顶部写了这一行:

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

  • 不带解释器行,使用纯文本:

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

  • 请阅读以下内容:-really@jsbueno但我不知道这些字符串是在代码中引入的。我无法检查调用logger的每个实例,因为代码库很大。该跟踪只包含标准python库中的文件/行号。