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 > <[email protected]>wrote: > >> On Thu, May 15, 2014 at 11:29 AM, Victor Stinner >> <[email protected]> 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 >>> [email protected] >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> >> _______________________________________________ >> OpenStack-dev mailing list >> [email protected] >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> > > > > _______________________________________________ > OpenStack-dev mailing list > [email protected] > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > _______________________________________________ OpenStack-dev mailing list [email protected] http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
