in src/main/cpp/propertyconfigurator.cpp [454:587]
AppenderPtr PropertyConfigurator::parseAppender(
helpers::Properties& props, const LogString& appenderName)
{
AppenderPtr appender = registryGet(appenderName);
if (appender != 0)
{
if (LogLog::isDebugEnabled())
{
LogLog::debug((LogString) LOG4CXX_STR("Appender \"")
+ appenderName + LOG4CXX_STR("\" was already parsed."));
}
return appender;
}
static const WideLife<LogString> APPENDER_PREFIX(LOG4CXX_STR("log4j.appender."));
// Appender was not previously initialized.
LogString prefix = APPENDER_PREFIX.value() + appenderName;
LogString layoutPrefix = prefix + LOG4CXX_STR(".layout");
std::shared_ptr<Object> obj =
OptionConverter::instantiateByKey(
props, prefix, Appender::getStaticClass(), 0);
appender = LOG4CXX_NS::cast<Appender>( obj );
// Map obsolete DailyRollingFileAppender property configuration
if (!appender &&
StringHelper::endsWith(OptionConverter::findAndSubst(prefix, props), LOG4CXX_STR("DailyRollingFileAppender")))
{
appender = std::make_shared<RollingFileAppender>();
auto datePattern = OptionConverter::findAndSubst(prefix + LOG4CXX_STR(".datePattern"), props);
if (!datePattern.empty())
props.put(prefix + LOG4CXX_STR(".fileDatePattern"), datePattern);
}
if (!appender)
{
LogLog::error((LogString) LOG4CXX_STR("Could not instantiate appender named \"")
+ appenderName + LOG4CXX_STR("\"."));
return 0;
}
appender->setName(appenderName);
if (appender->instanceof(OptionHandler::getStaticClass()))
{
Pool p;
if (appender->requiresLayout())
{
LayoutPtr layout;
std::shared_ptr<Object> obj =
OptionConverter::instantiateByKey(
props, layoutPrefix, Layout::getStaticClass(), 0);
layout = LOG4CXX_NS::cast<Layout>( obj );
if (layout != 0)
{
appender->setLayout(layout);
if (LogLog::isDebugEnabled())
{
LogLog::debug((LogString) LOG4CXX_STR("Parsing layout options for \"")
+ appenderName + LOG4CXX_STR("\"."));
}
PropertySetter::setProperties(layout, props, layoutPrefix + LOG4CXX_STR("."), p);
if (LogLog::isDebugEnabled())
{
LogLog::debug((LogString) LOG4CXX_STR("End of parsing for \"")
+ appenderName + LOG4CXX_STR("\"."));
}
}
}
RollingFileAppenderPtr rolling = LOG4CXX_NS::cast<rolling::RollingFileAppender>(appender);
if (rolling)
{
LogString rollingPolicyKey = prefix + LOG4CXX_STR(".rollingPolicy");
if (!OptionConverter::findAndSubst(rollingPolicyKey, props).empty())
{
RollingPolicyPtr rollingPolicy;
std::shared_ptr<Object> rolling_obj =
OptionConverter::instantiateByKey(
props, rollingPolicyKey, RollingPolicy::getStaticClass(), 0);
rollingPolicy = LOG4CXX_NS::cast<RollingPolicy>( rolling_obj );
if(rollingPolicy)
{
rolling->setRollingPolicy(rollingPolicy);
if (LogLog::isDebugEnabled())
{
LogLog::debug((LogString) LOG4CXX_STR("Parsing rolling policy options for \"")
+ appenderName + LOG4CXX_STR("\"."));
}
PropertySetter::setProperties(rollingPolicy, props, rollingPolicyKey + LOG4CXX_STR("."), p);
}
}
LogString triggeringPolicyKey = prefix + LOG4CXX_STR(".triggeringPolicy");
if (!OptionConverter::findAndSubst(triggeringPolicyKey, props).empty())
{
TriggeringPolicyPtr triggeringPolicy;
std::shared_ptr<Object> triggering_obj =
OptionConverter::instantiateByKey(
props, triggeringPolicyKey, TriggeringPolicy::getStaticClass(), 0);
triggeringPolicy = LOG4CXX_NS::cast<TriggeringPolicy>( triggering_obj );
if(triggeringPolicy)
{
rolling->setTriggeringPolicy(triggeringPolicy);
if (LogLog::isDebugEnabled())
{
LogLog::debug((LogString) LOG4CXX_STR("Parsing triggering policy options for \"")
+ appenderName + LOG4CXX_STR("\"."));
}
PropertySetter::setProperties(triggeringPolicy, props, triggeringPolicyKey + LOG4CXX_STR("."), p);
}
}
}
PropertySetter::setProperties(appender, props, prefix + LOG4CXX_STR("."), p);
if (LogLog::isDebugEnabled())
{
LogLog::debug((LogString) LOG4CXX_STR("Parsed \"")
+ appenderName + LOG4CXX_STR("\" options."));
}
}
registryPut(appender);
return appender;
}