As software developers we are ingrained to believe that copying and pasting code into multiple places is a bad idea. As everything in life, you should always question what you’re taught as there are always exception to the rule. I think logging abstractions are is one of these exceptions. How many of you have struggled with logging frameworks? How many times has one project or library used a different framework or version that causes incompatibilities? How many often do you use a maven exclude for apache commons logging, log4j, or slf4j because each dependency uses a different framework or version of that framework? Its a pain in the ass and a bleeping mess!
HornetQ was the first project I saw where they said, “To hell with logging abstractions!”. They wanted to reduce external dependencies and logging was at the top of their list. They implemented their own logging abstraction that used JUL by default, but that could also delegate to log4j, slf4j, etc. Generic findClass invocations were done to determine which logging framework was installed in the environment HornetQ was running in.
So, what I’m suggesting is that each project should cut and paste what HornetQ has done and incorporate it into their own projects. Let each project own their own logging abstraction and reduce their dependencies. A side effect is they’ve also reduced any potential maven transitive dependency conflicts as well. We did this very thing in Resteasy last year. This is one case where copy and pasting is a good thing.