Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I format warnings captured with logging.captureWarnings?

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?

like image 426
Joakim Lundborg Avatar asked Nov 12 '12 17:11

Joakim Lundborg


2 Answers

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.

like image 169
Martijn Pieters Avatar answered Oct 08 '22 11:10

Martijn Pieters


logging.captureWarnings logs to a logger named py.warnings, so you need to add your handler to that logger:

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)
py_warnings_logger = logging.getLogger('py.warnings')
py_warnings_logger.addHandler(console_handler)
like image 36
Pedro Romano Avatar answered Oct 08 '22 10:10

Pedro Romano