python日志记录dictConfig自定义格式化程序未被调用

JMW*_*JMW 8 python logging formatter

我的模块中有以下ColoeredFormatter.

但格式化程序不会被调用.我希望在控制台上"hi",但我得到"这是根记录器的信息".

我已经删除了所有.pyc文件,但它没有帮助.

MyModule的/ __ init__.py

from MyModule.ColoredFormatter import ColoredFormatter

__all__ = ('ColoredFormatter')
Run Code Online (Sandbox Code Playgroud)

MyModule的/ ColoredFormatter.py

import logging

class ColoredFormatter(logging.Formatter):
    def __init__(self, default):
        self.default = default

    def format(self, record):
        print("hi")
        record.msg = "hi"
        return self.default.format(record)
Run Code Online (Sandbox Code Playgroud)

我的剧本

import logging, logging.config, yaml

conf="""
logging:
  version: 1
  disable_existing_loggers: true
  root:
    level: !!python/name:logging.NOTSET
    handlers: [console]
  handlers:
    console:
      class: logging.StreamHandler
      stream: ext://sys.stdout
      formatter: myFormatter
      level: !!python/name:logging.NOTSET

  formatters:
    myFormatter:
      class: !!python/name:MyModule.ColoredFormatter
"""
dict = yaml.parse(conf)
logging.config.dictConfig(dict["logging"])

logging.info("This is an info of the root logger")
Run Code Online (Sandbox Code Playgroud)

JMW*_*JMW 12

在格式化部分我不得不更换class()

import logging, logging.config, yaml

conf="""
logging:
  version: 1
  disable_existing_loggers: true
  root:
    level: !!python/name:logging.NOTSET
    handlers: [console]
  handlers:
    console:
      class: logging.StreamHandler
      stream: ext://sys.stdout
      formatter: myFormatter
      level: !!python/name:logging.NOTSET

  formatters:
    myFormatter:
      '()': MyModule.ColoredFormatter
"""
dict = yaml.parse(conf)
logging.config.dictConfig(dict["logging"])

logging.info("This is an info of the root logger")
Run Code Online (Sandbox Code Playgroud)

  • 您能否详细说明如何获得此信息?我在任何地方都找不到 (2认同)
  • 谢谢@Evert,它有点难以找到,所以对于下一代:你可以在"用户定义对象"部分https://docs.python.org/2/library/logging.config中找到它. HTML#用户定义的对象 (2认同)

小智 9

我想补充一点,可调用对象接受工厂,dictConfig.将自定义参数传递给构造函数的简写是利用 lambda。

例子:

from MyModule import ColoredFormatter

...
    'formatters':
        '()': lambda: ColoredFormatter(foo='bar', ...),
Run Code Online (Sandbox Code Playgroud)