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. >>>>>> >>>>>> >>>> >>>> >> >>
