如何在Python日志配置文件(logging.conf)中添加过滤器

Kha*_*ino 5 python logging

是否可以在日志记录配置文件中添加/使用过滤器?例如,以下代码是否有等效的设置?

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代码仅作为示例)

Kha*_*ino 6

经过搜索,我在官方文档中找到了答案,上面写着

例如,您无法使用 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:我的代码很奇怪,就像我所知道的那样。我截断了一些更复杂的东西。

参考: