在定义记录器时在线定义处理程序
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
},
}
}
在下面的示例中,我尝试将处理程序 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
},
}
}