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

时间:2015-01-15 21:17:30

标签: python logging handler

在下面的示例中,我尝试将处理程序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
        },
    }
}

1 个答案:

答案 0 :(得分:0)

RotatingFileHandler部分所述,您应在console部分的handlers标记的LOGGING_BASE_DIR + 'application.log'旁边添加LOGGING_BASE_DIR

如果这个json字典是从文件加载的,那么你就不能使用logging.config.dictConfig()作为文件名,因为LOGGING_BASE_DIR没有被定义(而不是有效的字符串)这个背景)。在这种情况下,您应该使用完整且有效的路径名替换它。 如果你是从python脚本中生成这个字典(可能会调用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 }, } } ,而不是{{1}}。

您的字典可能如下所示:

{{1}}