Quoting Ralph Goers <[email protected]>:

To achieve what you want just get the LoggerConfig you want to modify, change its level and then call the updateLoggers() method of the LoggerContext.

I'm sorry. Maybe this seems lazy or unwarranted, but...

The only quick resource I could find was StackOverflow. And I hate that site, but it seemed to indicate that the public API as exposed in the javadocs is not the complete API of these objects/interfaces?

You are not telling me you have forged the Javadocs to be inconsistent with the real classes, are you? :-/.

Interface "org.apache.logging.log4j.spi.LoggerContext" has these four methods (in the javadoc):

- getExternalContext()
- getLogger()
- getLogger()
- hasLogger()

But now a SO example shows this code:

LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration conf = ctx.getConfiguration();
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG);
ctx.updateLoggers(conf);

These are also methods/techniques you have indicated or seem to have pointed at, mr. Ralph Goers. But LoggerContext.getConfiguration() is then an invisible or hidden method :).

I wish I had found a better resource to discover this information (you can never be sure about such unofficial or second hand sources, I guess).

However, a quick decompile suggests that this is mistaken. And indeed, that code doesn't compile.

My apologies for finding such a devious way of verifying the veracity of your words ;-).

So.

I checked out your sample at log4j-samples/configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfiguration.java, but it goes deeply into the core mechanics, as you may have indicated.

However, even updateLoggers() doesn't exist:

---
LogTest.java:15: error: cannot find symbol
Configuration conf = ctx.getConfiguration();
^
symbol: method getConfiguration()
location: variable ctx of type LoggerContext
LogTest.java:17: error: cannot find symbol
ctx.updateLoggers(conf);
^
symbol: method updateLoggers(Configuration)
location: variable ctx of type LoggerContext
2 errors
---

There is nothing in the public API that gives access to this stuff. As designed ;-) :) :P.

Haha. My god.

Okay. Core API.

Aah, now we see all those classes exist there as well, expanded, full, but how do we get there? :P. A simple thought comes to mind. But there is no LogManager in there. I still don't know how to get a fucking Context :P lol.

Such a separation is not really helpful or needed even, I guess, if those are the words. If the Public API have methods that give access to the Core API, then by agreement, if those methods return objects that are outside of the Public API, they still mostly honour the contract that any /methods/ in the Public API remain consistent and trusted across releases. So it would be a "use at your own risk" but the essential method from within the Public API that is being used does not break away from the consistency Interface agreement that you have with your users.

I may have found the answer in that Configurator.initialize() rewards a LoggerContext and it seems to be as simple as providing a default name and a config file location. From there on it would be possible to get a LoggerContext (out of Core) and then the world should open up ;-D.

But that means I should have left Default Land far behind and entered Anomaly Land in full :D. Which is not all that shabby to me (or shappy). It means that once I enter the Core I can /never/ get back to Public. I love being a Red Pill guy but this seems rather drastic lol.

Oh my.

So the Public API is truly just a view onto the Core, or a Window onto the Core that reveales a much smaller subset but provides a helper class (LogManager) that seems to make life easier. However, the LoggerContext can do the same. And one of the tasks of the LogManager is to provide a LoggerContext anyway.

There is just a difference between.

org.apache.logging.log4j.spi.LoggerContext and
org.apache.logging.log4j.core.LoggerContext.

But this /also/ means I only have to supply one jar file with my application! It gets better all the time lol.

Now, maybe I should go do something useful again. Wait! I have to test something..

Oooh... the madness. By changing the line:

import org.apache.logging.log4j.spi.LoggerContext;

to

import org.apache.logging.log4j.core.LoggerContext;

now suddenly the example works. The LoggerContext you get returned from the LogManager is just a plain Core LoggerContext, and an appropriate cast will reveal its methods.

The interface just shields many methods from the user.

I was tricked! My apologies people, sometimes I am just a turd.

Happy coding.

Bye.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to