> 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. On Wed, May 21, 2014 at 6:38 PM, Doug Hellmann <doug.hellm...@dreamhost.com>wrote: > On Thu, May 15, 2014 at 11:29 AM, Victor Stinner > <victor.stin...@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@lists.openstack.org > > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > > _______________________________________________ > OpenStack-dev mailing list > OpenStack-dev@lists.openstack.org > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >
_______________________________________________ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev