我有一个json配置文件,并在其中注册自定义记录器,我执行以下操作
logging.config.dictConfig(config)
myLogger = logging.getLogger("myCustomLogger")
当我调试时,我看到上面的第一个代码行在logger对象上调用getLogger并向其注册一个控制台处理程序。 我需要一个同一个记录器对象的句柄,因此,我再次调用getLogger,我认为再次注册相同的处理程序。
当我记录时,同一个日志条目在控制台上被写两次。
我没有看到从logging.config.dictConfig获取logger对象句柄的方法。
我在调试时观察到的奇怪的事情是,当断点超过第二行并检查与myLogger关联的处理程序数时,它只有1个处理程序。 这是我在pydev eclipse插件附带的python控制台上检查这个的方法
myLogger.handlers[1]
它给出了一个错误,指出索引不存在。
myLogger.handlers[0] works fine
对于python而言,这是一个全新的品牌,因此在这一点上出乎意料。有谁知道如何解决这个问题?
编辑:
这是dict config json文件
{
"version": 1,
"disable_existing_loggers": true,
"formatters": {
"custom": {
"format": "%(asctime)s %(levelname)s [%(applicationName)s,%(applicationState)s] %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "custom"
}
},
"root": {
"level": "INFO",
"handlers": ["console"]
},
"loggers": {
"myCustomLogger": {
"level": "INFO",
"handlers": ["console"],
"propagate": "false"
}
}
}
答案 0 :(得分:1)
试试这个
{
"version": 1,
"disable_existing_loggers": true,
"formatters": {
"custom": {
"format": "%(asctime)s %(levelname)s [%(applicationName)s,%(applicationState)s] %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "custom"
}
},
"root": {
"level": "INFO",
# this is the only difference from your original config file
"handlers": []
},
"loggers": {
"myCustomLogger": {
"level": "INFO",
"handlers": ["console"],
"propagate": "false"
}
}
}
关于你的问题:" 因此,根记录器无论如何都会采取行动?"如果它没有打印到屏幕上,那么它实际上什么都不做。日志消息仍在生成,但您的其他处理程序仍然需要它。