语法有点奇怪,但它在日志记录文档中进行了描述,位于用户定义的对象 https://docs.python.org/3/library/logging.config.html#logging-config-dict-userdef,你必须使用密钥()
, not class
。就像这样:
filters:
noConsoleFilter:
(): noConsoleFilter
接下来,您需要为类指定一个限定名称。如果您直接运行脚本,而不是作为模块,您可以在下面引用它__main__
:
filters:
noConsoleFilter:
(): __main__.noConsoleFilter
我还建议使用 PEP 8类名的 CapWords 约定 https://www.python.org/dev/peps/pep-0008/#class-names。这是一个稍微整理过的、完全独立的示例:
# logging.yml
version: 1
formatters:
simple_formatter:
format: "%(asctime)s %(name)s: %(message)s"
extended_formatter:
format: "%(asctime)s %(name)s %(levelname)s: %(message)s"
filters:
no_console_filter:
(): __main__.NoConsoleFilter
handlers:
console_handler:
class: logging.StreamHandler
level: INFO
formatter: simple_formatter
filters: [no_console_filter]
file_handler:
class: logging.FileHandler
level: INFO
filename: test.log
formatter: extended_formatter
root:
handlers: [console_handler, file_handler]
propagate: true
# script.py
import logging.config
import yaml
class NoConsoleFilter(logging.Filter):
def filter(self, record):
print('filtering!')
return not (record.levelname == 'INFO') & ('no-console' in record.msg)
with open('logging.yml', 'r') as f:
log_cfg = yaml.safe_load(f.read())
logging.config.dictConfig(log_cfg)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.info('no-console. Should not be in console, but be in test.log!')
logger.info('This is an info message')
logger.error('This is an error message')