python logging module problem
Peter Otten
__peter__ at web.de
Fri Jul 14 07:23:02 EDT 2006
Ritesh Raj Sarraf wrote:
> Vinay Sajip wrote:
>> It's usual to rely on logger levels and to set handler levels for
>> additional refinement of what goes to a particular handler's
>> destination.
> The problem is that for StreamHandler, logging module logs to
> sys.stderr.
> I want to use the logging feature for most of the messages my program
> displays.
>
> So some messages would be going to sys.stdout and some to sys.stderr.
>
> So, I'm ended up creating two handlers, one for sys.stdout and the
> other for sys.stderr.
> I'd then make INFO level messages go to sys.stdout and DEBUG level
> messages go to sys.stderr.
>
> What do you suggest ??
> Is it good doing this way ?
You can achieve the desired behaviour by adding a custom Filter:
import sys
import logging
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)
class LevelFilter(logging.Filter):
def __init__(self, level):
self.level = level
def filter(self, record):
return self.level == record.levelno
def make_handler(outstream, format, level):
handler = logging.StreamHandler(outstream)
formatter = logging.Formatter(format)
handler.setFormatter(formatter)
handler.addFilter(LevelFilter(level))
return handler
logger.addHandler(make_handler(sys.stderr,
'STDERR %(levelname)s %(message)s', logging.WARN))
logger.addHandler(make_handler(sys.stdout,
'STDOUT %(levelname)s %(message)s', logging.INFO))
logger.info("the world is flat")
logger.warning("take care not to fall off its rim")
Not sure whether this is a good idea. Another way might be to use distinct
loggers.
Peter
More information about the Python-list
mailing list