I tried again to use PropertiesUtil.getProperties().getStringProperty()
instead of System.getProperty, without success.
The reason is that this logic is executed to initialize a static field in
AbstractLogger; PropertiesUtil internally uses StatusLogger, which extends
AbstractLogger.

I see many log4j-api tests fail: it starts with
java.lang.NoClassDefFoundError: Could not initialize class
org.apache.logging.log4j.status.StatusLogger
and goes downhill from there...

Perhaps there is some way around this but I don't see it...


On Sat, Feb 20, 2016 at 7:18 AM, Remko Popma <[email protected]> wrote:

> I documented the new properties in the Configuration manual page. Did I
> forget to commit that?
>
>
> On Saturday, 20 February 2016, Remko Popma <[email protected]> wrote:
>
>> I initially used PropertiesUtil but this failed somehow. Since this is
>> used while initializing s class constant, the failure resulted in a
>> NoClassDefError...
>> So I reverted to System.getProperties.
>> I can take another look, or if someone else has time, please feel free to
>> replace this with PropertiesUtil.
>>
>> On Saturday, 20 February 2016, Ralph Goers <[email protected]>
>> wrote:
>>
>>> I should have qualified this to say that the log4j2.component.properties
>>> file is managed by the PropertiesUtil class.  Properties should be access
>>> through its methods.
>>>
>>> Ralph
>>>
>>> On Feb 19, 2016, at 1:09 PM, Ralph Goers <[email protected]>
>>> wrote:
>>>
>>> I see two new properties to allow users to override the default
>>> MessageFactory and FlowMessageFactory. It seems very unlikely they will
>>> ever get used, but they should NOT be calling System.getProperty() directly.
>>>
>>> Please remember that wherever adding something to the configuration
>>> won’t work you should access it through the log4j2.component.properties
>>> file.  Values in that file can be overridden via system properties, but
>>> users can just create the properties file instead. In general, we should be
>>> leveraging that mechanism and not calling System.getProperty().  We also
>>> need to document each of these properties in a clear way.
>>>
>>> JAXB or Jackson isn’t going to make anything any easier.
>>>
>>> Ralph
>>>
>>>
>>> On Feb 19, 2016, at 12:20 PM, Gary Gregory <[email protected]>
>>> wrote:
>>>
>>>
>>> On Fri, Feb 19, 2016 at 9:24 AM, Remko Popma <[email protected]>
>>> wrote:
>>> >
>>> > FlowMessageFactory is now extracted. I'm quite happy with the result.
>>> > Please take a look at
>>> https://issues.apache.org/jira/browse/LOG4J2-1255 for further follow-up.
>>>
>>> OK, that seems fine. Thank you for doing the work.
>>>
>>> The only thing I am not happy about is the use of system properties
>>> instead of the config file.
>>>
>>> We are perpetuating a mess here.
>>>
>>> What is the role of properties files vs a configuration file? Which one
>>> overrides the other? Are they mutually exclusive?
>>>
>>> I could see sys props set on a command line used to override all config
>>> files. Or the other way around?
>>>
>>> In the long run, the use of sys props is bad. Some users configure only
>>> via files saved and moved around machines. You can't do that with sys props.
>>>
>>> Please, let's not make it worse by adding MORE sys props.
>>>
>>> Is the real issue that it is too much of a PITA to update our config
>>> code for XML, JSON, and YAML to support a new setting?
>>>
>>> This tells me we're doing it wrong. I know we do not want to many deps,
>>> our current scheme is too hard to maintain. We could use JAXB or Jackson
>>> instead.
>>>
>>> Gary
>>>
>>> >
>>> > On Fri, Feb 19, 2016 at 2:40 PM, Remko Popma <[email protected]>
>>> wrote:
>>> >>
>>> >> I see, so there actually is a use case to remove the need for the
>>> isTraceEnabled check with the Supplier param...
>>> >>
>>> >> Sent from my iPhone
>>> >>
>>> >> On 2016/02/19, at 14:10, Ralph Goers <[email protected]>
>>> wrote:
>>> >>
>>> >>> The use case I wanted to do this for is:
>>> >>>
>>> >>> LOGGER.entry(“Request: “, ()->gson.toJson(request));
>>> >>> .
>>> >>> LOGGER.exit(response, ()->gson.toJson(response));
>>> >>>
>>> >>> However this can be handled just as easily by
>>> >>>
>>> >>> LOGGER.entry(new JsonMessage(request));
>>> >>> .
>>> >>> LOGGER.exit(response, new JsonMessage(response));
>>> >>>
>>> >>> so I can live without the Supplier. I don’t think MessageSupplier
>>> actually makes any sense. I can’t see why I would want to do:
>>> >>>
>>> >>> LOGGER.entry(()->new JsonMessage(request));
>>> >>>
>>> >>> since it is just creating one object instead of another.
>>> >>>
>>> >>> Ralph
>>> >>>
>>> >>>> On Feb 18, 2016, at 7:52 PM, Gary Gregory <[email protected]>
>>> wrote:
>>> >>>>
>>> >>>> On Feb 18, 2016 5:38 PM, "Remko Popma" <[email protected]>
>>> wrote:
>>> >>>> >
>>> >>>> > I would start with just a default FlowMessageFactory.
>>> Configurable with a system property, so users can swap in their own if they
>>> want.
>>> >>>> >
>>> >>>> > Only if the need arises to configure FlowMessageFactories on a
>>> per-logger basis, we can consider adding the methods to LogManager to
>>> support that.
>>> >>>> >
>>> >>>> > So no need for additional getLogger methods for now.
>>> >>>> >
>>> >>>> > The default FlowMessageFactory implementation would be the logic
>>> that's in AbstractMessageFactory now. Gary wrote it so I assume it meets
>>> his needs.
>>> >>>> >
>>> >>>> > Gary, shall we deprecate MessageSupplier and remove
>>> entry/exitTrace methods using them?
>>> >>>>
>>> >>>> That's fine with me.
>>> >>>>
>>> >>>> Gary
>>> >>>>
>>> >>>> >
>>> >>>> >
>>> >>>> > On Friday, 19 February 2016, Gary Gregory <[email protected]>
>>> wrote:
>>> >>>> >>
>>> >>>> >> On Thu, Feb 18, 2016 at 4:22 PM, Ralph Goers <
>>> [email protected]> wrote:
>>> >>>> >>>
>>> >>>> >>> Is it really necessary to have getLogger support
>>> FlowMessageFactory?  These messages are really meant as wrappers for other
>>> messages. so I am not even sure what it would mean for getLogger() to
>>> support that. How would it know what Message it is wrapping?
>>> >>>> >>>
>>> >>>> >>>
>>> >>>> >>> I am really getting sorry that I started this.
>>> >>>> >>
>>> >>>> >>
>>> >>>> >> Well, hopefully, whatever happens, this is getting all of us
>>> into reviewing existing and new code.
>>> >>>> >>
>>> >>>> >> Another benefit of this conversation is that I fell that we have
>>> been remarkably civil and respectful of each other, at least compared to
>>> other outrageous behavior one can read about on the webs.
>>> >>>> >>
>>> >>>> >> The use case I want most is in
>>> org.apache.logging.log4j.LoggerTest.flowTracingString_ObjectArray2_ParameterizedMessageFactory()
>>> >>>> >>
>>> >>>> >> Which can be summarized as:
>>> >>>> >>
>>> >>>> >> Logger myLogger = LogManager.getLogger("Some.Logger", new
>>> ParameterizedMessageFactory("Enter", "Exit"));
>>> >>>> >> EntryMessage msg = myLogger.traceEntry("doFoo(a={}, b={})", 1,
>>> 2);
>>> >>>> >> myLogger.traceExit(msg, 3);
>>> >>>> >>
>>> >>>> >> If I cannot pass in my flow message factory or if there are now
>>> two factories, I need to be able to set it somehow.
>>> >>>> >>
>>> >>>> >> I do not like the idea of have a setFlowMessageFactory on a
>>> Logger because I'd never want to change it.
>>> >>>> >>
>>> >>>> >> Gary
>>> >>>> >>
>>> >>>> >>>
>>> >>>> >>> Ralph
>>> >>>> >>>
>>> >>>> >>>> On Feb 18, 2016, at 3:31 PM, Gary Gregory <
>>> [email protected]> wrote:
>>> >>>> >>>>
>>> >>>> >>>> On Thu, Feb 18, 2016 at 2:13 PM, Remko Popma <
>>> [email protected]> wrote:
>>> >>>> >>>>>
>>> >>>> >>>>> I think preserving binary compatibility on its own is a
>>> strong reason for doing this, but it's more than that.
>>> >>>> >>>>
>>> >>>> >>>>
>>> >>>> >>>> OK, since org.apache.logging.log4j.message.MessageFactory is
>>> in log4j-api that's important. I can buy that. BUT, we are also adding
>>> methods to Logger so that would break some things too. I guess less
>>> breakage is better than more in this case!
>>> >>>> >>>>
>>> >>>> >>>> Overall, I not convinced that this is the best approach but I
>>> can appreciate that you seem to feel about it stronger that I do.
>>> >>>> >>>>
>>> >>>> >>>>>
>>> >>>> >>>>>
>>> >>>> >>>>> Having a separate factory for flow messages makes both
>>> factories more cohesive (single responsibility principle). No need for one
>>> factory to extend the other in my view.
>>> >>>> >>>>
>>> >>>> >>>>
>>> >>>> >>>> The distinction is pretty subtle here IMO. We are still
>>> talking about creating messages, but I get your point. For me, the only
>>> reason for this is to minimize the risk of API breakage, a nobe goal for
>>> the log4j-api module, if not a requirement.
>>> >>>> >>>>
>>> >>>> >>>>>
>>> >>>> >>>>>
>>> >>>> >>>>> The logger would have separate instances so users can
>>> configure them separately: lower coupling.
>>> >>>> >>>>
>>> >>>> >>>>
>>> >>>> >>>> OK. So now we have:
>>> >>>> >>>>
>>> >>>> >>>> org.apache.logging.log4j.LogManager.getLogger(Class<?>,
>>> MessageFactory)
>>> >>>> >>>> org.apache.logging.log4j.LogManager.getLogger(Object,
>>> MessageFactory)
>>> >>>> >>>> org.apache.logging.log4j.LogManager.getLogger(String,
>>> MessageFactory)
>>> >>>> >>>>
>>> >>>> >>>> We would add:
>>> >>>> >>>>
>>> >>>> >>>> org.apache.logging.log4j.LogManager.getLogger(Class<?>,
>>> MessageFactory, FlowMessageFactory)
>>> >>>> >>>> org.apache.logging.log4j.LogManager.getLogger(Object,
>>> MessageFactory, FlowMessageFactory)
>>> >>>> >>>> org.apache.logging.log4j.LogManager.getLogger(String,
>>> MessageFactory, FlowMessageFactory)
>>> >>>> >>>>
>>> >>>> >>>> Right? Any other places?
>>> >>>> >>>>
>>> >>>> >>>>>
>>> >>>> >>>>>
>>> >>>> >>>>> These are both desirable properties so I believe it would
>>> improve the design.
>>> >>>> >>>>>
>>> >>>> >>>>> Does this make sense?
>>> >>>> >>>>
>>> >>>> >>>>
>>> >>>> >>>> Sure, even though I am less gun-ho about it than you are. I'd
>>> say go ahead, see how it looks and feels after you refactor. We can keep
>>> discussing it once your changes hits the repo if need be.
>>> >>>> >>>>
>>> >>>> >>>> Thank you for putting in the work!
>>> >>>> >>>> Gary
>>> >>>> >>>>
>>> >>>> >>>>> Remko
>>> >>>> >>>>>
>>> >>>> >>>>> Sent from my iPhone
>>> >>>> >>>>>
>>> >>>> >>>>> On 2016/02/19, at 2:24, Gary Gregory <[email protected]>
>>> wrote:
>>> >>>> >>>>>
>>> >>>> >>>>>> Is a flow message factory a kind of message factory or a
>>> different kind of factory?
>>> >>>> >>>>>>
>>> >>>> >>>>>> Does a logger need instances of both or just the one?
>>> >>>> >>>>>>
>>> >>>> >>>>>> Since entry message extends message, should the factory do
>>> so as well?
>>> >>>> >>>>>>
>>> >>>> >>>>>> Gary, phone, typos.
>>> >>>> >>>>>>
>>> >>>> >>>>>> On Feb 18, 2016 8:44 AM, "Remko Popma" <
>>> [email protected]> wrote:
>>> >>>> >>>>>>>
>>> >>>> >>>>>>> Would anyone mind terribly if I factored out the
>>> FlowMessage creation methods from MessageFactory to a new interface
>>> FlowMessageFactory?
>>> >>>> >>>>>>>
>>> >>>> >>>>>>> Concretely, this interface would contain the methods
>>> introduced in LOG4J2-1255:
>>> >>>> >>>>>>>
>>> >>>> >>>>>>> EntryMessage newEntryMessage(Message message);
>>> >>>> >>>>>>> ExitMessage newExitMessage(Object object, Message message);
>>> >>>> >>>>>>> ExitMessage newExitMessage(EntryMessage message);
>>> >>>> >>>>>>> ExitMessage newExitMessage(Object object, EntryMessage
>>> message);
>>> >>>> >>>>>>>
>>> >>>> >>>>>>> I think flow messages are different enough from normal
>>> Messages that a separate factory makes sense.
>>> >>>> >>>>>>>
>>> >>>> >>>>>>> It would also insulate users who created a custom
>>> MessageFactory from the changes we made in LOG4J2-1255.
>>> >>>> >>>>>>>
>>> >>>> >>>>>>> Thoughts?
>>> >>>> >>>>>>>
>>> >>>> >>>>>>> -Remko
>>> >>>> >>>>>>>
>>> >>>> >>>>>>>
>>> >>>> >>>>
>>> >>>> >>>>
>>> >>>> >>>>
>>> >>>> >>>> --
>>> >>>> >>>> E-Mail: [email protected] | [email protected]
>>> >>>> >>>> Java Persistence with Hibernate, Second Edition
>>> >>>> >>>> JUnit in Action, Second Edition
>>> >>>> >>>> Spring Batch in Action
>>> >>>> >>>> Blog: http://garygregory.wordpress.com
>>> >>>> >>>> Home: http://garygregory.com/
>>> >>>> >>>> Tweet! http://twitter.com/GaryGregory
>>> >>>> >>>
>>> >>>> >>>
>>> >>>> >>
>>> >>>> >>
>>> >>>> >>
>>> >>>> >> --
>>> >>>> >> E-Mail: [email protected] | [email protected]
>>> >>>> >> Java Persistence with Hibernate, Second Edition
>>> >>>> >> JUnit in Action, Second Edition
>>> >>>> >> Spring Batch in Action
>>> >>>> >> Blog: http://garygregory.wordpress.com
>>> >>>> >> Home: http://garygregory.com/
>>> >>>> >> Tweet! http://twitter.com/GaryGregory
>>> >>>
>>> >>>
>>> >
>>>
>>> --
>>> E-Mail: [email protected] | [email protected]
>>> Java Persistence with Hibernate, Second Edition
>>> JUnit in Action, Second Edition
>>> Spring Batch in Action
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>>
>>>
>>>

Reply via email to