2011-11-11 23 views
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 file秒。我還刪除了原始日誌文件中的所有其他行,並且仍然在一個文件中出現了錯誤,而在另一個文件中沒有出現錯誤。我想從我的.vimrc刪除

set encoding=utf-8 

,再寫入文件,我仍然得到了錯誤在一個文件中,而不是在其他。

日誌是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.dumps上的字典。

我該如何追蹤?

+0

如果你從這篇文章複製該行,你會得到錯誤嗎? – agf

回答

1

您的問題:我該如何追蹤這個問題?

答:

(1)告訴我們,你得到了錯誤消息的全文 - 不知道什麼編碼您試圖使用,我們不能告訴你任何東西。回溯和代碼片段讀取文件並重現錯誤也很方便。

(2)寫一個小的Python腳本來查找文件中的行,然後做:

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

和複製/結果粘貼到你的問題的編輯,這樣我們就可以看到明確什麼是在線。

(3)除了­之外,它確實看起來像隨機亂碼,但告訴我們您是否期望該行是文本(如果是這樣,用什麼人類語言?)。