logging.handlers.SMTPHandler and fileConfig

Chris Rebert clp2 at rebertia.com
Mon Oct 11 12:15:05 EDT 2010


On Mon, Oct 11, 2010 at 7:52 AM, pstatham <pstatham at sefas.com> wrote:
> I'm trying to use pythons logging.handlers.SMTPHandler with a
> configuration file (so that I don't have to have passwords etc. inside
> of the script)
>
> Now the guide I'm following is [URL="http://docs.python.org/library/
> logging.html#configuration-file-format"]here[/URL], now the
> RotatingFileHandler is working, but I never receive an email, or an
> error for the SMTPHandler.
>
> Anyway here's the python code
>
> import logging
> import logging.config
>
> logDir = "./logs/"
>
> logging.config.fileConfig(logDir+'logging.conf')
> logging.getLogger('email')
>
> logging.debug('THIS IS A DEBUG MESSAGE')
> logging.error('THIS IS AN ERROR')
>
> And here's the config file
<snipped>
> Because I wasn't getting an error I decided to temporarily add some
> print statements into .\Lib\logging\handlers.py, In SMTPHandler
> __init__ I print out mailhost, from, to etc. And these are all
> correct. I then inserted a few print statements into the different
> levels of emit to see which branch of the logic it was following. None
> of the print statements print. Which leads me to believe emit() is
> never being called and therefore the email never gets sent.
>
> So what am I doing wrong?

Based on what the logging docs say about propagation, I /think/ the
problem is your use of plain logging.debug() and logging.error().
According to the docs, log messages sent to a child logger (e.g.
qualname="myapp.foo.bar") are by default propagated to their ancestor
loggers (e.g. qualname="myapp.foo") hierarchically, until you either
hit the root logger or a logger for which propagation has been
disabled.
logging.debug() and friends send messages directly to the root logger.
Since propagation works bottom-up rather than top-down, I believe
these messages aren't propagated to any other loggers, and processing
stops there, hence why your email logger isn't doing anything; it's
not receiving any messages in the first place.

Also, the following line in your code snippet was pointless:
logging.getLogger('email')
This returns the logger with the corresponding name, but you don't
assign it to anything, so the reference gets immediately thrown away.


I think you need to change your code snippet to the following:
logging.config.fileConfig(logDir+'logging.conf')
logger = logging.getLogger('email')

logger.debug('THIS IS A DEBUG MESSAGE')
logger.error('THIS IS AN ERROR')

Cheers,
Chris
--
http://blog.rebertia.com



More information about the Python-list mailing list