title: How do I format logs so they print out in columns?
body: <p>I have a project where different threads and functions are logging to the same <code>StreamHandler()</code> log in the console using different loglevels some of which are custom. </p>
  
  <p>My log is formatted to do:</p>
  
  <pre><code>streamformatter = logging.Formatter(fmt='%(levelname)s:\t%(threadName)s:\t%(funcName)s:\t\t%(message)s', datefmt='%H:%M:%S')
  </code></pre>
  
  <p>This makes my log by default look garbled like this where it isnt really pretty to look at or easy to see when what function is being called and from which thread.</p>
  
  <pre><code>INFO:   COM14-fwcif-listener :  _receive_v32:       my_success: Sending 24 lines to formatter
  DB_TRACE:   COM14-fwcif-listener :  _format_and_log_v32:        {"prompt": "undef-COM14", "x_type": "tracelogentry", "y_time": 1392695506.044583, "z_msg": "...."}
  INFO:   COM13-fwutil-listener:  _receive_v32:       my_success: Sending 10 lines to formatter
  DB_TRACE:   COM13-fwutil-listener:  _format_and_log_v32:        {"prompt": "undef-COM13", "x_type": "tracelogentry", "y_time": 1392695507.356714, "z_msg": "...."}
  INFO:   MainThread: _parse:     my_resolve after 4.9784979820251465 seconds and 29 vs 8 attempts
  MY_INFO:    MainThread: _parse:     my_success for cmd "trig" =&gt;&gt; "not ready". COM12.ISREADY now set to True
  INFO:   MainThread: send:       my_success. Lock being released: &lt;_thread.RLock owner=7512 count=1&gt; with cmd "format c:" and state COM12.ISREADY = False
  INFO:   COM12-fwmain-listener:  _receive_v32:       my_success: Number of lines split by S65 is 2 of 16 total lines
  INFO:   COM12-fwmain-listener:  _format_and_log_v32:        my_resolve "S65&gt;" added as COM12.lastlinefragment
  INFO:   COM12-fwmain-listener:  _format_and_log_v32:        my_success: 575 chars written to log.   Prompt and type detected is "S65&gt;" and "replylogentry: format"
  DB_REPLY:   COM12-fwmain-listener:  _format_and_log_v32:        {"prompt": "S65&gt;", "x_type": "replylogentry: format", "y_time": 1392695510.41302, "z_msg": "..."}
  INFO:   MainThread: _parse:     my_resolve  searching for "format"=&gt;"Unknown command" in string "..."
  </code></pre>