在定义记录器时在线定义处理程序

Defining handler in-line when defining logger

在下面的示例中,我尝试将处理程序 RotatingFileHandler(LOGGING_BASE_DIR + 'application.log', maxBytes=5e6, backupCount=10) 添加到记录器 device,但出现错误 ValueError: Unable to configure logger 'device': Unable to add handler <logging.handlers.RotatingFileHandler object at 0x1031beb10>: <logging.handlers.RotatingFileHandler object at 0x1031beb10>

我意识到我将一个处理程序定义为字符串,将另一个处理程序定义为处理程序对象,这可能就是它不起作用的原因。但是,是否有某种方法可以在配置中在线定义处理程序,或者我是否需要将处理程序本身与 console 处理程序一起添加到配置中?

LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': True,
    'incremental': False,

    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'debug',
            'stream': sys.stdout
        },
    },

    'loggers': {
        'device': {
            'handlers': [
                'console',
                RotatingFileHandler(LOGGING_BASE_DIR + 'application.log', maxBytes=5e6, backupCount=10),
            ],
            'level': 'DEBUG',
           'propagate': True
        },
    }
}

您应该在 handlers 部分中用 ID console 标记的那个旁边添加 RotatingFileHandler,如 logging dictionary schema details 中所述。

如果此 json 词典是从文件加载的,您将无法使用 LOGGING_BASE_DIR + 'application.log' 作为文件名,因为 LOGGING_BASE_DIR 未定义(并且未定义在此上下文中的有效字符串)。在这种情况下,您应该将其替换为完整且有效的路径名。 如果您从 python 脚本(可能会调用 logging.config.dictConfig() 的脚本)中生成此字典,那么您可以使用它,前提是您之前已经定义了 LOGGING_BASE_DIR 并且它指向到一个有效的路径。不过,我会使用 os.path.join,而不是 +

你的字典可能看起来像这样:

MYDIR = '/tmp/log'
LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': True,
    'incremental': False,

    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout'
        },
        'rotatingfile': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(MYDIR, 'application.log'),
            'maxBytes': 5e6,
            'backupCount': 10
        }
    },

    'loggers': {
        'device': {
            'handlers': [
                'console',
                'rotatingfile'
            ],
            'level': 'DEBUG',
           'propagate': True
        },
    }
}