In my application at one point I set the root Logger of java.util.logging
and all it's handlers to Level.FINEST
like this:
Logger.getLogger("").setLevel(Level.FINEST);
for (Handler handler : Logger.getLogger("").getHandlers()) {
handler.setLevel(Level.FINEST);
}
In a later point I create a class Logger like this:
private static final Logger JAVA_LOG = Logger.getLogger(MyClass.class.getName());
Now this loggers Level is INFO
(which seems to be the default for JUL), while it's root Loggers Level is properly set to FINEST
. Shouldn't setting the Level for the root Logger also set the Level for all children loggers of the root Logger? Am I doing something wrong in retrieving the class Logger?
Shouldn't setting the Level for the root Logger also set the Level for all children loggers of the root Logger?
No, apparently you are creating a new Logger object. Javadoc for getLogger states:
Please note, that even if there had been a Logger object with the same name before, you cannot rely on
getLogger
to return the same object as it might have been garbage collected if there is no strong reference to the object.If your aim is to create all Logger objects within your project with the same log level, you should not do it programmatically but by configuration. That is where
java.util.logging
comes in handy. The overall advantage is that you can run your application in different log levels without even changeing a single line of code.Simply edit your configuration file (which essentially is the above mentioned
LogManager configuration
). It is calledlogging.properties
and located in your JRE directory. There you can edit the last paragraph and configure project-wide or class-narrowed log levels:An even better solution is to copy
logging.properties
to your project directory and call your app with