So we could open an issue for this feature then? As we have already started
to discuss the implementation :)

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