I’m using a third party software library with a log prototype like this:
runtime.getInstance().log(int logtype, String moduleName, String logtext);
I have a utility library that I want to be library independent, but I also want to be able to log things to the software package from my own classes. This is fine and good, as the text messages are pretty universal, things like “you’ve passed bad data!” and “blah blah was successful!” Additionally, I’ve already wrapped the software vendor’s logging functionality, so I’m not even worried about conforming to some random API.
What I am worried about (why I’m writing this post) is that there are going to be various different modules throughout my system. So the problem is like:
ModuleFoo extends com.thirdpartyvendor.BaseModule
ModuleBar extends com.thirdpartyvendor.BaseModule
ModuleFoo —contains instance of—> IndependentDataStructure —tries to write a log entry to my WrappedLogger —> but data structure doesn’t have a reference to ModuleFoo.
ModuleBar —contains instance of—> IndependentDataStructure —tries to write a log entry to my WrappedLogger —> but data structure doesn’t have a reference to ModuleBar.
Currently my system passes a field String moduleName around which quite frankly makes me sick… but I want the log entries to tell me what my module is! How can the logger know whether the IndependentDataStructure instance is working with ModuleFoo and not ModuleBar (or some other module) without IndependentDataStructure containing a reference to a BaseModule (or a String moduleName)?
Logging APIs such as Log4J and SLF4J have the concept of a diagnostic context, a way to store various bits of contextual information in a
ThreadLocalmap which the log message formatters can access to decorate the messages. Typical uses for this are things like putting the name of the currently authenticated user into log messages in a web application (using a servlet filter to store the username in the MDC for each request), would you be able to use a similar concept in your system?