如何在python日志模块中指定级别?

cnjp1d6j  于 2023-03-07  发布在  Python
关注(0)|答案(3)|浏览(116)

我需要两个处理程序。一个用于文件日志记录,另一个用于控制台中的流日志记录。我需要为每个处理程序指定级别。注意,我的级别将类似于以下几个。
流处理程序--〉信息
文件处理程序--〉警告、错误、严重
这是我的代码。

# Create a custom logger
    logger = logging.getLogger('DBMQ')
    logger.setLevel(logging.DEBUG)

    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.INFO)

    logger.addHandler(stream_handler)

    file_handler = logging.FileHandler('./data/file.log')
    file_handler.setLevel(logging.WARNING)

    logger.addHandler(file_handler)

现在,它必须像这样运行:

logger.debug('hey') # Nothing should happen
logger.info('hey') # only stream handler should log this message
logger.warning('hey') # only file handler should log this message but the stream does too
logger.error('hey') # only file handler should log this message but the stream does too
logger.critical('hey') # only file handler should log this message but the stream does too

我需要禁止流处理程序记录warningerrorcritical日志级别。有什么方法可以过滤这个处理程序吗?

iq0todco

iq0todco1#

您可以创建自己的处理程序:

logger = logging.getLogger('DBMQ')
logger.setLevel(logging.DEBUG)

class MyStreamHandler(logging.StreamHandler):
    def emit(self, record):
        if record.levelno == self.level:
            super().emit(record)

stream_handler = MyStreamHandler()
stream_handler.setLevel(logging.INFO)

logger.addHandler(stream_handler)

file_handler = logging.FileHandler('./data/file.log')
file_handler.setLevel(logging.WARNING)

logger.addHandler(file_handler)
zbq4xfa0

zbq4xfa02#

“级别”系统不能作为禁用/启用单个“级别”工作。https://docs.python.org/3/library/logging.html#logging-levels
“level”是一个整数值。如果消息的级别超过了记录器/处理器级别,它就会显示出来。就是这么简单。
如果你需要另一个逻辑,唯一的方法就是实现你自己的处理程序。

z9smfwbn

z9smfwbn3#

我喜欢Lufftre的回答,但我不喜欢为此创建一个完整类的想法,所以我基本上是将StreamHandler的emit函数修补为lambda函数,如下所示:

chs = logging.StreamHandler()
chs.setLevel(logging.INFO)
chs.semit = chs.emit # You have to "clone" original emit, as there is no super()
chs.emit = lambda record: chs.semit(record) if record.levelno == chs.level else None
logger.addHandler(chs)

如果你想让多个处理程序以这种方式工作,那么你可以先定义一个函数,这个函数就是lambda,然后用这个函数对象来修补emit

# Set up new emit
nemit = lambda record, sh: sh.semit(record) if record.levelno == sh.level else None

# Create first handler
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
ch.semit = ch.emit 
ch.emit = lambda record: nemit(record, ch)

# Create second handler
chs = logging.StreamHandler()
chs.setLevel(logging.INFO)
chs.semit = chs.emit
chs.emit = lambda record: nemit(record, chs)

logger.addHandler(ch)
logger.addHandler(chs)

相关问题