0

我正在尝试在以下日志行中追踪 Python UnicodeDecodeError:

10.210.141.123 - - [09/Nov/2011:14:41:04 -0800] "gfR\x15¢\x09ì|Äbk\x0F[×ÐÖà\x11CEÐÌy\x5C¿DÌj\x08Ï ®At\x07å!;f>\x08éPW¤\x1C\x02ö*6+\x5C\x15{,ªIkCRA\x22 xþP9â\x13h\x01­¢è´\x1DzõWiË\x5C\x10sòʨR)¶²\x1F8äl¾¢{ÆNw\x08÷@ï" 400 166 0.000 "-" "-"

我在 Vim 中打开了整个日志文件,然后将这一行拉到一个新文件中,这样我就可以只测试一行。但是,我的解析脚本适用于新文件 - 它不会引发 UnicodeDecodeError。我不明白为什么一个文件会产生错误而另一个不会,当它们(表面上)相同时。

这是我尝试过的:运行enca以确定文件编码,它抱怨Cannot determine (or understand) your language preferences. file -i说这两个文件都是Regular files。我还删除了原始日志文件中的每一行,但一个文件中仍然出现错误,另一个文件中没有错误。我尝试删除

set encoding=utf-8 

从我的 .vimrc 中,再次写入文件,我仍然在一个文件中得到错误,而在另一个文件中没有。

日志是 nginx 日志。Nginx 在他们的发行说明中有这个说明:

*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
   in an access_log.
   Thanks to Maxim Dounin.

我的 Python 脚本有with open('log_file') as f,当我尝试调用json.dumpsdict 时出现错误。

我怎样才能找到这个?

4

1 回答 1

1

你的问题:我怎样才能找到这个?

回答:

(1) 向我们展示您收到的错误消息的全文——在不知道您尝试使用什么编码的情况下,我们无法告诉您任何信息。读取文件并重现错误的回溯和代码片段也很方便。

(2) 编写一个很小的 ​​Python 脚本来查找文件中的行,然后执行以下操作:

print repr(the_line) # Python 2.X
print ascii(the_line) # Python 3.x

并将结果复制/粘贴到您的问题的编辑中,以便我们可以清楚地看到该行中的内容。

(3) 它看起来确实像随机乱码,­但确实告诉我们您是否希望该行是文本(如果是,是什么人类语言?)。

于 2011-11-11T08:26:24.933 回答