Considering every log message in PropertiesUtil is an error message, maybe
that class could just use System.err instead.

On 21 February 2016 at 19:12, Ralph Goers <[email protected]>
wrote:

> It might be.
>
> Ralph
>
> On Feb 21, 2016, at 4:19 PM, Matt Sicker <[email protected]> wrote:
>
> Maybe PropertiesUtil is too low-level to use StatusLogger? I remember
> fighting with a similar problem a while ago due to cyclic dependencies like
> that.
>
> On 21 February 2016 at 07:13, Remko Popma <[email protected]> wrote:
>
>> 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
>>>>>
>>>>>
>>>>>
>>>>>
>>
>
>
> --
> Matt Sicker <[email protected]>
>
>
>


-- 
Matt Sicker <[email protected]>

Reply via email to