2

I need a way for a python logger to not log ERROR or above. Need it to only log less than ERROR.

import logging
from logging import StreamHandler

def get_log_formatter():
    datefmt = '%b %d %y %H:%M:%S'
    formatter = logging.Formatter('%(asctime)s [%(module)s:%(levelname)s] %(message)s',
                          datefmt=datefmt)
    return formatter

class MyHandler(StreamHandler):
    def __init__(self, max_level, *args, **kwargs):
        super(MyHandler, self).__init__(*args, **kwargs)
        self.max_level = max_level
    def emit(self, record):
        if record.levelno >= self.max_level:
            return
        return super(MyHandler, self).emit(record)

handl = MyHandler(logging.ERROR)
handl.setLevel(logging.INFO)
handl.setFormatter(get_log_formatter())
logger = logging.getLogger("testing_logger")
logger.addHandler(handl)
logger.setLevel(logging.INFO)

This seems to work, but does it make sense? Is there a better way to filter out the logline?

In [3]: logger_num = 0

In [4]: logger = remake()

In [5]: logger.info("Why")
May 16 01 16:50:10 [<ipython-input-5-c350362291ad>:INFO] Why

In [6]: logger.warn("Why")
May 16 01 16:50:13 [<ipython-input-6-56809439d5a4>:WARNING] Why

In [7]: logger.error("Why")

In [8]:

1 Answer 1

2

Draw back of your solution is that you'd have to subclass every handler you'd like to use.

A context filter is much clearer in it's intent:

class MaxFilter:
    def __init__(self, max_level):
        self.max_level = max_level

    def filter(self, record):
        if record.levelno < self.max_level:
            return True

And can be applied to any handler as such:

any_concrete_handler.addFilter(MaxFilter(logging.INFO))
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.