Hi Carter, I have several needs I am trying to satisfy. I have a lot of customizations I have to support and implement in Log4j 1 and 2 (the Log4j 1 code is being migrated to Log4j 2, but we still need to use the bridge to support Log4j 1 in 3rd party dependencies and transitive dependencies). We have new apps, we have legacy apps, we have a lot of code. We do a lot of what I would call in-flight manipulation of Log4j 1 and 2 in these apps, and some plain old [re]configurations using the Configurator APIs, which are the easy use cases to implement and support. Users (devs and admins really) can change the Log4j configuration file and have Log4j monitor the file and that's fine, but that's the advanced case because people can too easily muck up these configuration files. Instead of mucking with files, these app servers come up, stay up, and need to be configured and reconfigured through a set of (REST) admin APIs. Some of these admin tasks do all sorts of introspections and reconfigurations and that is where this kind of API comes in. I want to be able to start from something like an Interpolator (in all these code bases, we use the Log4j Interpolator, Commons Lang, Common Text, you name it, it's in some code base somewhere), find this or that StrLookup and returns pieces of it to client, so a UI can say "You're got this config setting, would you like to change it?". Depending on the use case, the app, and the server combo, sometimes changing a setting, means the UI generates a new config file and sends it over, sometimes to translates to calling a specific Configurator API like one of the setLevel() APIs, and some other time we query and/or edit objects directly in Log4j and elsewhere. Sorry for the long write up!
Gary On Wed, Jan 19, 2022 at 6:32 PM Carter Kozak <cko...@ckozak.net> wrote: > Any chance you could help me understand the rationale for this feature? I > opted not to implement a method akin to MapLookup.getMap because that > wasn't used, avoiding unnecessary API constraints allows us to refactor > more easily in the future. If the values are required elsewhere, it may be > reasonable, but I have another change in flight that may impact such > consumers. > > Thanks! > -ck > > On Sat, Jan 15, 2022, at 18:45, ggreg...@apache.org wrote: > > This is an automated email from the ASF dual-hosted git repository. > > ggregory pushed a commit to branch release-2.x > in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git > > commit d402f360fbad18bc3c0902a65e8e53a1202e57d5 > Author: Gary Gregory <garydgreg...@gmail.com> > AuthorDate: Sat Jan 15 18:45:37 2022 -0500 > > Add PropertiesLookup#getProperties(). > > Commit 1/2 for cherry-picking to master. > --- > .../logging/log4j/core/lookup/PropertiesLookup.java | 19 > ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/PropertiesLookup.java > b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/PropertiesLookup.java > index 995a71b..3066792 100644 > --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/PropertiesLookup.java > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/PropertiesLookup.java > @@ -34,16 +34,28 @@ public final class PropertiesLookup implements > StrLookup { > */ > private final Map<String, String> properties; > > + /** > + * Constructs a new instance for the given map. > + * > + * @param properties map these. > + */ > public PropertiesLookup(final Map<String, String> properties) { > this.properties = properties == null > ? Collections.emptyMap() > : properties; > } > > + /** > + * Gets the property map. > + * > + * @return the property map. > + */ > + public Map<String, String> getProperties() { > + return properties; > + } > + > @Override > - public String lookup( > - @SuppressWarnings("ignored") final LogEvent event, > - final String key) { > + public String lookup(@SuppressWarnings("ignored") final LogEvent > event, final String key) { > return lookup(key); > } > > @@ -65,4 +77,5 @@ public final class PropertiesLookup implements StrLookup > { > public String toString() { > return "PropertiesLookup{properties=" + properties + '}'; > } > + > } > > >