[openstack-dev] [oslo] Logging exceptions and Python 3

Ben Nemec openstack at nemebean.com
Wed May 21 21:38:58 UTC 2014


On 05/21/2014 12:11 PM, Igor Kalnitsky wrote:
>> So, write:
>>
>>     LOG.debug(u'Could not do whatever you asked: %s', exc)
>>
>> or just:
>>
>>     LOG.debug(exc)
> 
> Actually, that's a bad idea to pass an exception instance to
> some log function: LOG.debug(exc). Let me show you why.
> 
> Here a snippet from logging.py:
> 
>     def getMessage(self):
>         if not _unicode:
>             msg = str(self.msg)
>         else:
>             msg = self.msg
>             if not isinstance(msg, basestring):
>                 try:
>                     msg = str(self.msg)
>                 except UnicodeError:
>                     msg = self.msg  # we keep exception object as it is
>         if self.args:               # this condition is obviously False
>             msg = msg % self.args
>         return msg                  # returns an exception object, not a
> text
> 
> And here another snippet from the format() method:
> 
>     record.message = record.getMessage()
>     # ... some time formatting ...
>     s = self._fmt % record.__dict__ # FAIL
> 
> the old string formatting will call str(), not unicode() and we will FAIL
> with UnicodeEncodeError.

This is exactly why we had to do
https://github.com/openstack/oslo-incubator/blob/master/openstack/common/log.py#L344

As long as it gets passed in as unicode in the first place the logging
code handles it fine, but if it gets passed in as a generic object it
will blow up.

@Doug: It occurs to me that this might be a problem with our plan to
stop using the ContextAdapter. :-/

> 
> 
> 
> On Wed, May 21, 2014 at 6:38 PM, Doug Hellmann
> <doug.hellmann at dreamhost.com>wrote:
> 
>> On Thu, May 15, 2014 at 11:29 AM, Victor Stinner
>> <victor.stinner at enovance.com> wrote:
>>> Hi,
>>>
>>> I'm trying to define some rules to port OpenStack code to Python 3. I
>> just
>>> added a section in the "Port Python 2 code to Python 3" about formatting
>>> exceptions and the logging module:
>>>
>> https://wiki.openstack.org/wiki/Python3#logging_module_and_format_exceptions
>>>
>>> The problem is that I don't know what is the best syntax to log
>> exceptions.
>>> Some projects convert the exception to Unicode, others use str(). I also
>> saw
>>> six.u(str(exc)) which is wrong IMO (it can raise unicode error if the
>> message
>>> contains a non-ASCII character).
>>>
>>> IMO the safest option is to use str(exc). For example, use
>>> LOG.debug(str(exc)).
>>>
>>> Is there a reason to log the exception as Unicode on Python 2?
>>
>> Exception classes that define translatable strings may end up with
>> unicode characters that can't be converted to the default encoding
>> when str() is called. It's better to let the logging code handle the
>> conversion from an exception object to a string, since the logging
>> code knows how to deal with unicode properly.
>>
>> So, write:
>>
>>     LOG.debug(u'Could not do whatever you asked: %s', exc)
>>
>> or just:
>>
>>     LOG.debug(exc)
>>
>> instead of converting explicitly.
>>
>> Doug
>>
>>>
>>> Victor
>>>
>>> _______________________________________________
>>> OpenStack-dev mailing list
>>> OpenStack-dev at lists.openstack.org
>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>
>> _______________________________________________
>> OpenStack-dev mailing list
>> OpenStack-dev at lists.openstack.org
>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>>
> 
> 
> 
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
> 




More information about the OpenStack-dev mailing list