title: Modifying logging message format based on message logging level in Python3
body: <p>I asked this question for python 2 <a href="https://stackoverflow.com/questions/1343227/can-pythons-logging-format-be-modified-depending-on-the-message-log-level">here</a>, but bumped into the issue again when the the answer no longer worked for Python 3.2.3.</p>
  
  <p>Here's code that works on Python 2.7.3:</p>
  
  <pre><code>import logging
  
  # Attempt to set up a Python3 logger than will print custom messages
  # based on each message's logging level.
  # The technique recommended for Python2 does not appear to work for
  # Python3
  
  class CustomConsoleFormatter(logging.Formatter):
      """
      Modify the way DEBUG messages are displayed.
  
      """
      def __init__(self, fmt="%(levelno)d: %(msg)s"):
          logging.Formatter.__init__(self, fmt=fmt)
  
      def format(self, record):
  
          # Remember the original format
          format_orig = self._fmt
  
          if record.levelno == logging.DEBUG:
              self._fmt = "DEBUG: %(msg)s"
  
          # Call the original formatter to do the grunt work
          result = logging.Formatter.format(self, record)
  
          # Restore the original format
          self._fmt = format_orig
  
          return result
  
  
  # Set up a logger
  my_logger = logging.getLogger("my_custom_logger")
  my_logger.setLevel(logging.DEBUG)
  
  my_formatter = CustomConsoleFormatter()
  
  console_handler = logging.StreamHandler()
  console_handler.setFormatter(my_formatter)
  
  my_logger.addHandler(console_handler)
  
  my_logger.debug("This is a DEBUG-level message")
  my_logger.info("This is an INFO-level message")
  </code></pre>
  
  <p>A run using Python 2.7.3:</p>
  
  <pre><code>tcsh-16: python demo_python_2.7.3.py 
  DEBUG: This is a DEBUG-level message
  20: This is an INFO-level message
  </code></pre>
  
  <p><br></p>
  
  <p>As far as I can tell, conversion to Python3 requires only a slight mod to CustomConsoleFormatter.<strong>init</strong>():</p>
  
  <pre><code>def __init__(self):
      super().__init__(fmt="%(levelno)d: %(msg)s", datefmt=None, style='%')
  </code></pre>
  
  <p>On Python 3.2.3:</p>
  
  <pre><code>tcsh-26: python3 demo_python_3.2.3.py
  10: This is a DEBUG-level message
  20: This is an INFO-level message
  </code></pre>
  
  <p><br>
  As you can see, my desire to replace '10' with 'DEBUG' is being thwarted.</p>
  
  <p>I've tried digging around in Python3 source and it looks like the PercentStyle instantiation is clobbering self._fmt after I, well, clobber it myself.</p>
  
  <p>My logging chops stop just short of being able to work around this wrinkle.</p>
  
  <p>Can anyone recommend another way or perhaps point out what I'm overlooking?</p>