void PropertyConfigurator::parseLogger()

in src/main/cpp/propertyconfigurator.cpp [356:452]


void PropertyConfigurator::parseLogger(
	helpers::Properties& props, LoggerPtr& logger, const LogString& /* optionKey */,
	const LogString& loggerName, const LogString& value, bool additivity)
{
	if (LogLog::isDebugEnabled())
	{
		LogLog::debug(((LogString) LOG4CXX_STR("Parsing for ["))
			+ loggerName
			+ LOG4CXX_STR("] with value=[")
			+ value + LOG4CXX_STR("]."));
	}

	// We must skip over ',' but not white space
	StringTokenizer st(value, LOG4CXX_STR(","));

	// If value is not in the form ", appender.." or "", then we should set
	// the level of the logger.
	if (!(value.find(LOG4CXX_STR(",")) == 0 || value.empty()))
	{
		// just to be on the safe side...
		if (!st.hasMoreTokens())
		{
			return;
		}

		LogString levelStr = st.nextToken();
		if (LogLog::isDebugEnabled())
		{
			LogLog::debug((LogString) LOG4CXX_STR("Level token is [")
				+ levelStr +  LOG4CXX_STR("]."));
		}


		// If the level value is inherited, set logger level value to
		// null. We also check that the user has not specified inherited for the
		// root logger.
		if (StringHelper::equalsIgnoreCase(levelStr, LOG4CXX_STR("INHERITED"), LOG4CXX_STR("inherited"))
			|| StringHelper::equalsIgnoreCase(levelStr, LOG4CXX_STR("NULL"), LOG4CXX_STR("null")))
		{
			static const WideLife<LogString> INTERNAL_ROOT_NAME(LOG4CXX_STR("root"));

			if (loggerName == INTERNAL_ROOT_NAME.value())
			{
				LogLog::warn(LOG4CXX_STR("The root logger cannot be set to null."));
			}
			else
			{
				logger->setLevel(0);
				if (LogLog::isDebugEnabled())
				{
					LogLog::debug((LogString) LOG4CXX_STR("Logger ")
						+ loggerName + LOG4CXX_STR(" set to null"));
				}
			}
		}
		else
		{
			logger->setLevel(OptionConverter::toLevel(levelStr, Level::getDebug()));

			if (LogLog::isDebugEnabled())
			{
				LogLog::debug((LogString) LOG4CXX_STR("Logger ")
					+ loggerName + LOG4CXX_STR(" set to ")
					+ logger->getLevel()->toString());
			}
		}

	}

	AppenderPtr appender;
	LogString appenderName;
	std::vector<AppenderPtr> newappenders;

	while (st.hasMoreTokens())
	{
		appenderName = StringHelper::trim(st.nextToken());

		if (appenderName.empty() || appenderName == LOG4CXX_STR(","))
		{
			continue;
		}

		if (LogLog::isDebugEnabled())
		{
			LogLog::debug(LOG4CXX_STR("Parsing appender named ")
				+ appenderName + LOG4CXX_STR("\"."));
		}
		appender = parseAppender(props, appenderName);

		if (appender != 0)
		{
			newappenders.push_back(appender);
		}
	}

	logger->reconfigure( newappenders, additivity );
}