I tried this feature in HBase but got some problems. I've already filed LOG4J2-3394 to describe the problems.
PTAL. Thanks. 张铎(Duo Zhang) <[email protected]> 于2022年1月17日周一 12:30写道: > 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. >>> > > > >>>>>> >>> > > > >>>>>> >>> > > > >>>> >>> > > > >>>> >>> > > > >> >>> > > > >> >>> > > > >>> > > > >>> > > >>> > >>> >>
