Python 101: An Intro to logging
blog.pythonlibrary.org
blog.pythonlibrary.org
</rant>
EDIT: Forgot to mention that although I haven't worked on this for a couple of months, I'm about to revisit it and would love to have other contributors. Please, fork this and make it better!
import logging as log
log.warning("groupthink says it sucks")
log.error("omg wtf, so hard!!!")
log.basicConfig(filename='ignorance.log',level=log.DEBUG)
log.debug("rtfm", exc_info=True)
And so on; formatting, handlers, multiple loggers, config files, proper lib logging, etc. All very pluggable and extendable, but only if you need it.There's a basic tutorial, advanced tutorial and a cookbook. http://docs.python.org/library/logging.html
(Groupthink, ignorance, RTFM? Seriously?)
I'd secretly hope requests was built on top of socket directly.
>>> 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.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 to3. 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.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...
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.