在Python记录器中使用变量控制的日志记录级别



我想写一个函数,从用户那里获得请求的日志级别,比如:

import logging
logger = logging.getLogger()
def func(log_level: <Type?>):
logger.log_level("everything is bad")

这能做到吗?

您可以使用它。它首先看起来有点冗长,但您可以很容易地添加附加处理程序(可能是一些记录到文件中的处理程序…(

import logging
logger = logging.getLogger()
handler = logging.StreamHandler() #you can also use FileHandler here, but then you need to specify a path
handler.setLevel(logging.NOTSET)
LOG_FORMAT = "%(levelname)s: %(message)s"
formatter = logging.Formatter(LOG_FORMAT)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.log(logging.CRITICAL, "your logging message 1") #==> CRITICAL: your logging message 1
logger.log(logging.WARN,     "your logging message 2") #==> WARN: your logging message 2

注1:LOG_FORMAT是根据日志文件定义的

注2:此处解释日志记录级别(logging.DEBUGlogging.INFO…(。您也可以相应地使用整数值:

日志记录.XX
NOTSET0
调试10
信息20
警告30
错误40
关键50

只需使用记录器的log()方法,该方法采用级别、格式字符串和参数。

import logging
logger = logging.getLogger()
def func(log_level: int, message: str):
logger.log(log_level, message)

logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s')
func(logging.DEBUG, 'message at DEBUG level')
func(logging.INFO, 'message at INFO level')
func(logging.CRITICAL, 'message at CRITICAL level')

哪个打印

DEBUG    message at DEBUG level
INFO     message at INFO level
CRITICAL message at CRITICAL level

运行时。

您可以使用上下文管理器,我引用文档中的"有时,临时更改日志记录配置并在执行某些操作后将其恢复会很有用。为此,上下文管理器是保存和恢复日志记录上下文的最明显方式。这里是这样一个上下文管理器的简单示例,它允许您选择性地更改日志记录级别,并纯粹在上下文管理器范围内添加日志记录处理程序:;

import logging
import sys
class LoggingContext:
def __init__(self, logger, level=None, handler=None, close=True):
self.logger = logger
self.level = level
self.handler = handler
self.close = close
def __enter__(self):
if self.level is not None:
self.old_level = self.logger.level
self.logger.setLevel(self.level)
if self.handler:
self.logger.addHandler(self.handler)
def __exit__(self, et, ev, tb):
if self.level is not None:
self.logger.setLevel(self.old_level)
if self.handler:
self.logger.removeHandler(self.handler)
if self.handler and self.close:
self.handler.close()
# implicit return of None => don't swallow exceptions

确切地说,在文档中,它在这里:https://docs.python.org/3/howto/logging-cookbook.html#using-a-context-manager-for-selective-logging。您还可以从以下位置重写任何示例代码段:https://docs.python.org/3/howto/logging-cookbook.html#using-登录多个模块。

最新更新