是否可以在日志记录配置文件中添加/使用过滤器?例如,以下代码是否有等效的设置?
import logging
# Set up loggers and handlers.
# ...
class LevelFilter(logging.Filter):
def __init__(self, level):
self.level = level
def filter(self, record):
return record.levelno == self.level
logFileHandler.addFilter(LevelFilter(logging.DEBUG))
Run Code Online (Sandbox Code Playgroud)
用于logging.conf中的处理程序
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=format_01
args=(sys.stdout,)
Run Code Online (Sandbox Code Playgroud)
我们可以像处理程序一样在配置文件(logging.conf)中为上面的Python代码编写日志过滤器吗?(Python代码仅作为示例)
经过搜索,我在官方文档中找到了答案,上面写着
例如,您无法使用 fileConfig() 配置 Filter 对象,该对象提供超出简单整数级别的消息过滤。如果您需要在日志配置中包含 Filter 实例,则需要使用 dictConfig()。
logging.conf 格式是
[loggers]
keys=root,log02,log03,log04,log05,log06,log07
[handlers]
keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
[formatters]
keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
Run Code Online (Sandbox Code Playgroud)
没有过滤器的配置,如下所示
[filters]
keys=filter01,filter02
Run Code Online (Sandbox Code Playgroud)
小智 6
如果你愿意的话,我用 Json 做了一个例子。通过遵循逻辑应该可以轻松切换到您的格式:)
{
"version": 1,
"disable_existing_loggers": true,
"filters": {
"skipDebug": {
"()": "__main__.RemoveLevelFilter",
"levelToSkip": "DEBUG"
}
},
"formatters": {
"simple": {
"format": "%(asctime)s|%(name)s [%(levelname)s] - %(message)s"
}
},
"handlers": {
"console":{
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "simple",
"stream" : "ext://sys.stdout"
},
"file": {
"level": "DEBUG",
"class": "logging.handlers.RotatingFileHandler",
"maxBytes": 5242880,
"backupCount": 3,
"formatter": "simple",
"filename": "log.log",
"mode": "a",
"encoding": "utf-8",
"filters": ["skipDebug"]
}
},
"loggers": { },
"root": {
"handlers": ["console", "file"],
"level": "DEBUG"
}
}
Run Code Online (Sandbox Code Playgroud)
当您初始化记录器时,如下所示:
class RemoveLevelFilter(object):
def __init__(self, levelToSkip):
self.level = levelToSkip
def filter(self, record):
return self.getLogLevelName(record.levelno) != self.level
enter code here
def getLogLevelName(self, levelno):
switcher = {
10: "DEBUG",
20: "INFO",
30: "WARNING",
40: "ERROR",
50: "CRITICAL"
}
return switcher.get(levelno, "INVALID")
with open("logging.json", "r", encoding="utf-8") as fd:
logging.config.dictConfig(json.load(fd))
logger = logging.getLogger(__name__)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
Run Code Online (Sandbox Code Playgroud)
PS:我的代码很奇怪,就像我所知道的那样。我截断了一些更复杂的东西。
参考: