When setting DEBUG=True (i.e., in devstack and other development environments) we noticed that all the python-*client API calls would get logged multiple times. On high-traffic dev instances, it would be dozens of repeats for each log message. This made development work on these instances an experience somewhere on the scale between "hey, this is annoying" and "it's impossible to tell what's going on through all this noise"
Testing revealed that the problem seems to stem from different mod_wsgi processes/threads vivifying their own API client objects. The clients seem to blindly shove logging handlers into the list without looking to see if it's necessary to do so first, and this causes Horizon to have dozens of identical handlers for each log message, and it then does what you expect.
This isn't a problem with Horizon per se, but Horizon is affected by it. So far, we've observed the problem with novaclient, cinderclient and keystoneclient, but all the client libraries likely behave in the same fashion.
We also discovered in testing that there is no logging handler defined for cinderclient in the local_settings.py, so it uses the default hander.
When setting DEBUG=True (i.e., in devstack and other development environments) we noticed that all the python-*client API calls would get logged multiple times. On high-traffic dev instances, it would be dozens of repeats for each log message. This made development work on these instances an experience somewhere on the scale between "hey, this is annoying" and "it's impossible to tell what's going on through all this noise"
Testing revealed that the problem seems to stem from different mod_wsgi processes/threads vivifying their own API client objects. The clients seem to blindly shove logging handlers into the list without looking to see if it's necessary to do so first, and this causes Horizon to have dozens of identical handlers for each log message, and it then does what you expect.
This isn't a problem with Horizon per se, but Horizon is affected by it. So far, we've observed the problem with novaclient, cinderclient and keystoneclient, but all the client libraries likely behave in the same fashion.
We also discovered in testing that there is no logging handler defined for cinderclient in the local_settings.py, so it uses the default hander.