Search code examples
javaloggingmacroseffective-java

Make my logger very effective to my Java-application


I am struggling with the following problem and ask for help.

My application has a logger module. This takes the trace level and the message (as string).

Often should be messages constructed from different sources and/or different ways (e.G. once using String.format in prior of logging, other times using .toString methods of different objects etc). Therefore: the construction method of the error messages cannot be generalized.

What I want is, to make my logger module effective. That means: the trace messages would only then be constructed if the actual trace level gets the message. And this by preventing copy-paste code in my application.

With C/C++, by using macros it was very easy to achive:

#define LOG_IT(level, message) if(level>=App.actLevel_) LOG_MSG(message);

The LOG_MSG and the string construction was done only if the trace level enabled that message.

With Java, I don't find any similar possibility for that. That to prevent: the logging would be one line (no if-else copy-pastes everywhere), and the string construction (expensive operation) only be done if necessary.

The only solution I know, is to surrond every logger-calls with an IF-statement. But this is exactly what I avoided previously in the C++ app, and what I want to avoid in my actual Java-implementation.

My problem is, on the target system only Java 1.6 is available. Therefore the Supplier is not a choice.

What can I do in Java? How can this C/C++ method easily be done?


Solution

  • Newest logging libraryies, including java.util.logging, have a second form of methods, taking a Supplier<String>.

    e.g. log.info( ()->"Hello"); instead of log.info("Hello");.

    The get() method of the supplier is only called if the message has effectively to be logged, therefore your string is only constructed in that case.