Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

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.


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.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: