The DeploymentFailureListener should be logging if a service associated with the deployment fails. So the issue must be in the deployment chain.
I like the idea of identifying one place that's responsible for logging errors. I'm not sure what it is though. Passing in a special UpdateResultHandler can work at boot, but then we'd want to make sure that the update classes don't log the error in applyUpdate. But then when applyUpdate is called any time other than boot, the special URH isn't there, and nothing gets logged.
A solution to that is to ensure that any time we call applyUpdate we pass in the special URH. But, if the user themselves passed in a URH we'd have to use a wrapper that delegates to both our logging URH and the user's.