我有一个json配置文件并在其中注册自定义记录器,我执行以下操作
logging.config.dictConfig(config)
myLogger = logging.getLogger("myCustomLogger")
调试时,我看到上面的第一行代码在logger对象上调用了getLogger并向其注册了控制台处理程序。
我需要同一个记录器对象的句柄,因此,我再次调用getLogger,我认为它再次注册了相同的处理程序。
当我登录时,同一日志条目在控制台上写入了两次。
我看不到从logging.config.dictConfig获取记录器对象句柄的方法。
我在调试时观察到的奇怪现象是,当断点超过第二行并检查与myLogger关联的处理程序的数量时,它只有1个处理程序。
这就是我在pydev eclipse插件随附的python控制台上检查的方式
myLogger.handlers[1]
它给我一个错误,指出索引不存在。
myLogger.handlers[0] works fine
对于python来说是相当新的东西,所以在这一点上已经没有想法了。有谁知道如何解决这个问题?
编辑:
这是字典配置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"
}
}
}
最佳答案
尝试这个
{
"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"
}
}
}
至于您的问题:“那么根记录器无论如何都会起作用?”如果未在屏幕上打印,则实际上无所事事。日志消息仍在生成,但是您的其他处理程序仍然需要它。
关于python - Python记录重复的日志条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44186667/