The recursive problem is that StatusLogger extends AbstractLogger...

On Mon, Feb 22, 2016 at 10:40 AM, Gary Gregory <[email protected]>
wrote:

> Is there a way StatusLogger could use System.err when it is not fully
> initialized? So that everything can still use StatusLogger?
>
> Gary
>
> On Sun, Feb 21, 2016 at 5:20 PM, Matt Sicker <[email protected]> wrote:
>
>> 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]>
>>
>
>
>
> --
> E-Mail: [email protected] | [email protected]
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>

Reply via email to