UnicodeDecodeError when logging an Exception in Python

可紊 提交于 2020-02-03 04:42:06

问题


I'm using Python 2.7.9. x32 on Win7 x64.

When I'm logging an Exception containing Umlauts, I always receive
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 39: ordinal not in range(128)

My example code is:

except Exception as e:
            logging.error('Error loading SCMTool for repository '
                          '%s (ID %d): %s' % (repo.name, repo.id, e),
                          exc_info=1)

The Exception being logged is WindowsError: [Error 267] Der Verzeichnisname ist ungültig. The Problem is based on the "ungÜltig" umlaut.

After removing the last %s and the e it works without a problem.

This happens everytime an exception is logged, therefore changing every logger is no alternative.

Does anyone have an idea how to make Exception return a unicode string globally?


回答1:


You are trying to interpolate a unicode object into a str template, triggering an implicit encoding.

Use a unicode template; logging can handle Unicode just fine:

logging.error(u'Error loading SCMTool for repository '
              '%s (ID %d): %s' % (repo.name, repo.id, e),
              exc_info=1)

Two additional tips:

  • You don't have to do the interpolation yourself; if you pass in the 3 elements to interpolate as separate arguments, logging will interpolate for you, but only if the message is actually going to be emitted.

  • If you use logging.exception() the message is logged at the ERROR level and exc_info is set for you; it gets you the same result but is more easily recognised when reading your code later. Either way, the exception is already included in that case, no need to include it again in the message.

As such, I'd use:

logging.exception(
    'Error loading SCMTool for repository %s (ID %d)',
    repo.name, repo.id)


来源:https://stackoverflow.com/questions/28626984/unicodedecodeerror-when-logging-an-exception-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!