1

我想编写一个函数来获取用户请求的日志记录级别,例如:

import logging

logger = logging.getLogger()

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

这可以做到吗?

4

3 回答 3

1

只需使用记录器的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

运行时。

于 2021-12-14T21:01:59.723 回答
1

你可以用这个。它首先看起来有点冗长,但您可以轻松添加额外的处理程序(也许一些记录到文件中......)

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根据logging-documentation定义

注意 2:日志记录级别 ( logging.DEBUG, logging.INFO...) 在这里解释。您也可以相应地使用整数值:

日志记录.XX 价值
没有设置 0
调试 10
信息 20
警告 30
错误 40
批判的 50
于 2021-12-14T13:40:07.173 回答
0

您可以使用上下文管理器,我在文档中引用“有时临时更改日志记录配置并在执行某些操作后将其恢复回来会很有用。为此,上下文管理器是保存和恢复的最明显方式“

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-logging-in-multiple-modules 。

于 2021-12-14T16:01:50.320 回答