
Python 101: An Intro to logging - driscollis
http://www.blog.pythonlibrary.org/2012/08/02/python-101-an-intro-to-logging/
======
pjscott
Logging is the worst kind of Python standard-library module: too clunky and
ugly to be pleasant, but not bad enough to justify the breakage of using a
third-party alternative. In comparison, urllib and urllib2 are great, because
they suck so much that everybody just uses requests instead.

</rant>

~~~
andreasvc
How can urllib be great when it sucks?

~~~
montecarl
I think his point is that it is great because it is bad enough that it forces
people use a much nicer library.

------
jhull
One extremely useful method that I almost never see in tutorials is

    
    
        >>> logging.exception("an exception happened here and will be printed")
        

This will print out the message and then the full formatted error traceback.
In many of my old projects I built a whole string formatting mess that would
print out and format exceptions and just recently discovered that
logging.exception() does that all for you.

~~~
masklinn
I would add 3 (three!) things which either are not covered in the article or
(worse) are mis-handled.

1\. `exc_info`. The truth is that `logging.exception(message)` is roughly
equivalent to `logging.error(message, exc_info=True)`. Now it also expresses
intent more clearly so it is a fine method, but what if you want to log an
exception at DEBUG level (because it's not an error and you have some sort of
fallback)?

    
    
        logging.debug(message, exc_info=True)
    

will do that for you (note: it should only used from within an `except`
clause)

2\. Do _not_ perform string formatting calls in your logging call, let the
library do it, just provide the parameters. Instead of TFA's

    
    
        logging.info("added %s and %s to get %s" % (x, y, x+y))
    
      write
    
        logging.info("added %s and %s to get %s", x, y, x+y)
    

it's slightly less verbose, and it lets `logging` _not to the formatting at
all_ if it does not need to

3\. Last, but not least, if you're trying to log expensive-to-fetch
information, use `Logger.isEnabledFor(level)` e.g.

    
    
        if logger.isEnabledFor(logging.DEBUG):
            logger.debug("Something: %s", super_expensive_call())
    

that avoids `super_expensive_call()` if the current logging configuration
would not lead to `debug` messages being broadcast for the logger.

------
eliben
Honestly, I don't see a reason to repeat what Doug Hellman did with Python
Module Of The Week a while ago:

<http://www.doughellmann.com/PyMOTW/py-modindex.html>

His articles are comprehensive (were made into a book). For example, the one
on logging is here:

[http://www.doughellmann.com/PyMOTW/logging/index.html#module...](http://www.doughellmann.com/PyMOTW/logging/index.html#module-
logging)

------
joshlegs
You know, I really love the Python posts on here.

Obviously there is a (hard-to-get-to) search function here. But it would be
cool if you could set up like newslists or something for certain keywords in
post titles, such as Python, etc.

