I spent some time reading the code of log4j2-core, and posted what I have
learned so far on the jira issue.

I could give it a try but I need a mentor.

Appreciate if someone in the community could help here.

Thanks.

张铎(Duo Zhang) <[email protected]> 于2022年1月15日周六 11:54写道:

> Filed https://issues.apache.org/jira/browse/LOG4J2-3341.
>
> Gary Gregory <[email protected]> 于2022年1月11日周二 21:21写道:
>
>> On Tue, Jan 11, 2022 at 8:20 AM 张铎(Duo Zhang) <[email protected]>
>> wrote:
>>
>> > So we could open an issue for this feature then? As we have already
>> started
>> > to discuss the implementation :)
>> >
>>
>> Yes, that sounds like a good idea. Feel free to go ahead :-)
>>
>> Gary
>>
>>
>> >
>> > Thanks~
>> >
>> > Volkan Yazıcı <[email protected]> 于2022年1月11日周二 19:42写道:
>> >
>> > > Giving it a one more try:
>> > >
>> > > <CompoundProperty>
>> > >    <Source>${sys:hadoop.root.logger}</Source>
>> > >    <Split delimiter="\s+" trim="true" blanksExcluded="true">
>> > >        <item index="0">hadoop.root.logger.level</item>
>> > >        <slice startIndex="1">hadoop.root.logger.appender</slice>
>> > >    </Split>
>> > > </CompoundProperty>
>> > >
>> > > On Mon, Jan 10, 2022 at 3:54 PM Ralph Goers <
>> [email protected]>
>> > > wrote:
>> > >
>> > > > Yeah, that syntax is better although it doesn’t solve the multiple
>> > > > appender refs case either.
>> > > >
>> > > > LoggerConfig accepts a List<AppenderRef> so it would seem that if we
>> > > > modify LoggerConfig
>> > > > to add another attribute that is a string that creates an
>> AppenderRef
>> > for
>> > > > each item then
>> > > > one could do
>> > > >
>> > > > <Logger name=“xyzzy” level=“INFO” appenderRefNames=“a, b, c”/>
>> > > >
>> > > >
>> > > > Ralph
>> > > >
>> > > > > On Jan 10, 2022, at 5:04 AM, Volkan Yazıcı <[email protected]>
>> wrote:
>> > > > >
>> > > > > I am curious if shall we adopt a more generic approach to
>> extraction:
>> > > > >
>> > > > > <CompoundProperty>
>> > > > >   <Source>${sys:hadoop.root.logger}</Source>
>> > > > >   <Targets pattern="^(.+)\s*,\s(.+)$">
>> > > > >       <Target>hadoop.root.logger.level</Target>
>> > > > >       <Target>hadoop.root.logger.appender</Target>
>> > > > >   </Targets>
>> > > > > </CompoundProperty>
>> > > > >
>> > > > > On Mon, Jan 10, 2022 at 5:53 AM Ralph Goers <
>> > > [email protected]>
>> > > > > wrote:
>> > > > >
>> > > > >> OK, I had a suspicion the reason for needing this was something
>> like
>> > > > that.
>> > > > >>
>> > > > >> The syntax you propose below would require modifying
>> PropertiesUtil,
>> > > the
>> > > > >> Property
>> > > > >> plugin and StrSubstitutor to support arrays. I don’t think I’d
>> want
>> > to
>> > > > go
>> > > > >> down that path.
>> > > > >> StrSubstitutor is already complicated and the idea of enhancing
>> it
>> > to
>> > > > >> support stuff like
>> > > > >> this doesn’t excite me.
>> > > > >>
>> > > > >> I think we’d be better off creating a new plugin for this.
>> Something
>> > > > like:
>> > > > >>
>> > > > >> <CompoundProperty name=“hadoop.root.logger.level” split=“,”
>> > > > >> index=“0”>${sys:hadoop.root.logger}</CompoundProperty>
>> > > > >> <CompoundProperty name=“hadoop.root.logger.appender” split=“,”
>> > > > >> index=“1”>${sys:hadoop.root.logger}</CompoundProperty>
>> > > > >>
>> > > > >> The only problem here is if you want to provide more than one
>> > appender
>> > > > >> this won’t
>> > > > >> work well. But I am sure we could enhance AppenderRef to accept a
>> > list
>> > > > of
>> > > > >> appenders.
>> > > > >>
>> > > > >> Ralph
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >>> On Jan 9, 2022, at 5:29 PM, 张铎(Duo Zhang) <
>> [email protected]>
>> > > > wrote:
>> > > > >>>
>> > > > >>> Thank you for the reply.
>> > > > >>>
>> > > > >>> And yes, it is not only for the root logger, we have tons of
>> > > different
>> > > > >>> loggers in hadoop, as hadoop is constructed with several
>> different
>> > > > >> projects
>> > > > >>> actually, and they are developed by different groups of
>> people...
>> > > > >>>
>> > > > >>> And on splitting the config in shell, actually this is exactly
>> > what I
>> > > > >> have
>> > > > >>> done in HBase
>> > > > >>>
>> > > > >>> See
>> > > > >>>
>> > > > >>
>> > > >
>> > >
>> >
>> https://github.com/apache/hbase/blob/3ec3df5887e9271f7e75779eafe2439012cfb2c3/bin/hbase#L829
>> > > > >>>
>> > > > >>> And also
>> > > > >>>
>> > > > >>
>> > > >
>> > >
>> >
>> https://github.com/apache/hbase/blob/3ec3df5887e9271f7e75779eafe2439012cfb2c3/bin/hbase.cmd#L336
>> > > > >>>
>> > > > >>> For HBase maybe it is acceptable but hadoop is another story.
>> > > > >>> Hadoop is widely used almost in every bigdata platform. Among
>> the
>> > > > >>> companies I've worked with, they all have their own hadoop
>> > deployment
>> > > > >>> systems which have modified version of start up scripts...
>> > > > >>>
>> > > > >>> I can imagine that if we do the same trick in HBase, then people
>> > will
>> > > > ask
>> > > > >>> again and again on the mailing list why passing
>> > -Dhadoop.root.logger
>> > > > does
>> > > > >>> not work, as well as other options like -Dyarn.root.logger,
>> > > > >>> -Dhadoop.security.logger, etc...
>> > > > >>>
>> > > > >>> So it will be good if we can support configure level and
>> appenders
>> > in
>> > > > one
>> > > > >>> property.
>> > > > >>>
>> > > > >>> Or maybe another way is to enhance the ability in the Properties
>> > > > section,
>> > > > >>> so we can split one property into two properties, something like
>> > > > >>>
>> > > > >>> <Properties>
>> > > > >>> <Property name="hadoop.root.logger"
>> > > > >>> type="array">${sys:hadoop.root.logger:-INFO,Console}</Property>
>> > > > >>> <Property
>> > > > >>>
>> name="hadoop.root.logger.level">${hadoop.root.logger[0]}</Property>
>> > > > >>> <Property name="hadoop.root.logger.appender">
>> > > ${hadoop.root.logger[1]}
>> > > > >>> </Property>
>> > > > >>> <Properties>
>> > > > >>>
>> > > > >>> Notice that since we could add multiple appenders here, maybe we
>> > need
>> > > > to
>> > > > >>> support something like ${hadoop.root.logger[1:] to combine all
>> the
>> > > > >>> appenders...
>> > > > >>> This could also solve the problem as people could still pass
>> > > > >>> -Dhadoop.root.logger.
>> > > > >>>
>> > > > >>> But I'm not sure if adding the ability to split a string in
>> > > > configuation
>> > > > >>> could introduce new possible security concerns...
>> > > > >>>
>> > > > >>> Thanks.
>> > > > >>>
>> > > > >>> Ralph Goers <[email protected]> 于2022年1月10日周一 07:14写道:
>> > > > >>>
>> > > > >>>> We already support this with two variables. But if they only
>> want
>> > to
>> > > > >> pass
>> > > > >>>> one then we have two options:
>> > > > >>>> 1. Modify PropertiesConfiguration to support a new element that
>> > > > allows a
>> > > > >>>> Level and AppenderRef which then gets split internally.
>> > > > >>>> 2. Create a Lookup that extracts the relevant portion of the
>> data.
>> > > > >>>>
>> > > > >>>> Ralph
>> > > > >>>>
>> > > > >>>>> On Jan 9, 2022, at 3:08 PM, Gary Gregory <
>> [email protected]
>> > >
>> > > > >> wrote:
>> > > > >>>>>
>> > > > >>>>> I think it is reasonable to say we can support this through 2
>> > > instead
>> > > > >> of
>> > > > >>>> 1
>> > > > >>>>> variable.
>> > > > >>>>>
>> > > > >>>>> Duo?
>> > > > >>>>>
>> > > > >>>>> Gary
>> > > > >>>>>
>> > > > >>>>> On Sun, Jan 9, 2022, 16:24 Ralph Goers <
>> > [email protected]
>> > > >
>> > > > >>>> wrote:
>> > > > >>>>>
>> > > > >>>>>> I’m looking at this and have a couple of concerns. The script
>> > has
>> > > > >>>>>>
>> > > > >>>>>>
>> > > > >>>>>>
>> > > HADOOP_ROOT_LOGGER=${HADOOP_ROOT_LOGGER:-${HADOOP_LOGLEVEL},console}
>> > > > >>>>>>
>> > > > >>>>>>
>> > > > >>>>
>> > > > >>
>> > > >
>> > >
>> >
>> HADOOP_DAEMON_ROOT_LOGGER=${HADOOP_DAEMON_ROOT_LOGGER:-${HADOOP_LOGLEVEL},RFA}
>> > > > >>>>>>
>> > > HADOOP_SECURITY_LOGGER=${HADOOP_SECURITY_LOGGER:-INFO,NullAppender}
>> > > > >>>>>>
>> > > > >>>>>> So it seems you need this for more than just the root logger.
>> > > > >>>>>>
>> > > > >>>>>> Second, you are asking us to accept “level, appender”  as the
>> > > value
>> > > > >> and
>> > > > >>>>>> under the covers split the
>> > > > >>>>>> value and assign the level to the level attribute and the
>> > appender
>> > > > >> name
>> > > > >>>> to
>> > > > >>>>>> the AppenderRef.
>> > > > >>>>>>
>> > > > >>>>>> While this certainly can be done it seems like it would be
>> just
>> > as
>> > > > >> easy
>> > > > >>>> to
>> > > > >>>>>> do the split in the script
>> > > > >>>>>> and create two different variables for the logging
>> configuration
>> > > to
>> > > > >> pick
>> > > > >>>>>> up.  Is there a reason that
>> > > > >>>>>> you can’t do this - for example perhaps users have hacked
>> your
>> > > > scripts
>> > > > >>>> and
>> > > > >>>>>> now you can’t
>> > > > >>>>>> change them without breaking them? If so, was this
>> “supported”?
>> > > > >>>>>>
>> > > > >>>>>> Ralph
>> > > > >>>>>>
>> > > > >>>>>>
>> > > > >>>>>>
>> > > > >>>>>>> On Jan 9, 2022, at 8:01 AM, 张铎(Duo Zhang) <
>> > [email protected]
>> > > >
>> > > > >>>> wrote:
>> > > > >>>>>>>
>> > > > >>>>>>> I brought this up in the incubator mailing list, and was
>> > > suggested
>> > > > to
>> > > > >>>>>>> report directly to the log4j community.
>> > > > >>>>>>>
>> > > > >>>>>>> https://issues.apache.org/jira/browse/HADOOP-16206
>> > > > >>>>>>>
>> > > > >>>>>>> In hadoop we started to try migrating to log4j2 long ago,
>> but
>> > it
>> > > is
>> > > > >> not
>> > > > >>>>>>> easy. For now, one of the most blocker issues is the lack of
>> > > > support
>> > > > >> of
>> > > > >>>>>>> 'log4j.rootLogger=INFO,Console' grammar. Notice that we do
>> not
>> > > want
>> > > > >> to
>> > > > >>>>>> stay
>> > > > >>>>>>> on the bridge api, we want to fully migrate to log4j2
>> finally,
>> > so
>> > > > >>>>>>> supporting the above grammar in log4j1 bridge is not enough.
>> > > > >>>>>>>
>> > > > >>>>>>> This is the main log4j configuration file for hadoop
>> > > > >>>>>>>
>> > > > >>>>>>>
>> > > > >>>>>>
>> > > > >>>>
>> > > > >>
>> > > >
>> > >
>> >
>> https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/main/conf/log4j.properties
>> > > > >>>>>>>
>> > > > >>>>>>> We have this in the file
>> > > > >>>>>>>
>> > > > >>>>>>> # Define the root logger to the system property
>> > > > "hadoop.root.logger".
>> > > > >>>>>>>> log4j.rootLogger=${hadoop.root.logger}
>> > > > >>>>>>>
>> > > > >>>>>>>
>> > > > >>>>>>> So our users could simply pass -Dhadoop.root.logger to
>> control
>> > > the
>> > > > >>>> level
>> > > > >>>>>>> and appender.
>> > > > >>>>>>>
>> > > > >>>>>>>
>> > > > >>>>>>
>> > > > >>>>
>> > > > >>
>> > > >
>> > >
>> >
>> https://github.com/apache/hadoop/blob/39efbc6b6fe53abed15f5639edcbaaa2a9dda6d2/hadoop-common-project/hadoop-common/src/main/bin/hadoop-functions.sh#L904
>> > > > >>>>>>>
>> > > > >>>>>>> Here we use an environment variable in our start up scripts.
>> > And
>> > > I
>> > > > >>>>>> believe
>> > > > >>>>>>> there are lots of other hadoop deployment systems which will
>> > have
>> > > > >> their
>> > > > >>>>>> own
>> > > > >>>>>>> start scripts.
>> > > > >>>>>>>
>> > > > >>>>>>> So in general, it is just impossible for us to drop the
>> > > > >>>>>>> -Dhadoop.root.logger way of configuring our logging system.
>> > > > >>>>>>>
>> > > > >>>>>>> So here I want to ask if it is possible for log4j2 to still
>> > > support
>> > > > >> the
>> > > > >>>>>>> 'log4j.rootLogger=INFO,Console' grammar. I'm not saying you
>> > must
>> > > > add
>> > > > >> it
>> > > > >>>>>>> back with no change, we just need a way to configure the
>> level
>> > > and
>> > > > >>>>>> appeners
>> > > > >>>>>>> at once, so something like
>> > > > >>>>>>> 'log4j2.rootLogger.levelAndAppender=INFO,Console' is also
>> OK.
>> > > > >>>>>>>
>> > > > >>>>>>> Thanks.
>> > > > >>>>>>
>> > > > >>>>>>
>> > > > >>>>
>> > > > >>>>
>> > > > >>
>> > > > >>
>> > > >
>> > > >
>> > >
>> >
>>
>

Reply via email to