How do I format warnings captured with logging.captureWarnings?

logging, python, warnings

Solution

You created a handler, but never configured the logging module to use it:

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)

You need to add this handler to a logger; the root logger for example:

logging.getLogger().addHandler(console_handler)

Alternatively, you can add the handler to the warnings logger only; the `captureWarnings()` documentation states that it uses `py.warnings` for captured warnings:

logging.getLogger('py.warnings').addHandler(console_handler)

Instead of creating a handler and formatter explicitly, you can also just call `basicConfig()` to configure the root logger:

logging.basicConfig(format='%(asctime)s\t%(levelname)s\t%(message)s', level=logging.DEBUG)

The above basic configuration is the moral equivalent of the handler configuration you set up.

Problem

I have used the following code to get warnings to be logged: ``` import logging logging.captureWarnings(True) formatter = logging.Formatter('%(asctime)s\t%(levelname)s\t%(message)s') console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(formatter) ``` This works, however, my logging formatter is not applied, and the warnings come out looking like this: ``` WARNING:py.warnings:/home/joakim/.virtualenvs/masterload/local/lib/python2.7/site-packages/MySQL_python-1.2.3c1-py2.7-linux-x86_64.egg/MySQLdb/cursors.py:100: Warning: InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. ``` instead of the expected format: ``` 2012-11-12 18:19:44,421 INFO START updating products ``` How can I apply my normal formatting to captured warning messages?

Original source