log4cplus-1.2.1
通过代码可以清楚的了解配置文件是如何生效的
log4cplus.logger.logClient=INFO, logClient
log4cplus.appender.logClient=log4cplus::SocketAppender
log4cplus.appender.logClient.host=10.1.14.115
log4cplus.appender.logClient.port=1234
log4cplus.appender.logClient.MaxFileSize=20MB
log4cplus.appender.logClient.MaxBackupIndex=2
log4cplus.appender.logClient.File=./iLog/logClient1.log
log4cplus.appender.logClient.Threshold=INFO
log4cplus.appender.logClient.layout=log4cplus::PatternLayout
log4cplus.appender.logClient.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S.%q}][%c_%p]%m%n
以上配置文件中的配置由configureAppenders()函数解析并创建对应的append对象指针,并配置
void
PropertyConfigurator::configureAppenders()
{
通过"appender."找到所有appender配置,保存到appenderProperties中,由后面代码使用
helpers::Properties appenderProperties =
properties.getPropertySubset(LOG4CPLUS_TEXT("appender."));
std::vector
tstring factoryName;
printf("configureAppenders\n");
for(std::vector
it != appendersProps.end(); ++it)
{
if( it->find( LOG4CPLUS_TEXT('.') ) == tstring::npos )
{
factoryName = appenderProperties.getProperty(*it);
factoryName为类名由配置文件配置 “log4cplus.appender.logClient=log4cplus::SocketAppender”
spi::AppenderFactory* factory
= spi::getAppenderFactoryRegistry().get(factoryName);
if (! factory)
{
tstring err =
LOG4CPLUS_TEXT("PropertyConfigurator::configureAppenders()")
LOG4CPLUS_TEXT("- Cannot find AppenderFactory: ");
helpers::getLogLog().error(err + factoryName);
continue;
}
通过关键字"(*it)+ LOG4CPLUS_TEXT(".")" 为(logClient.),提取出”logClient.“后面的参数到props_subset中,用来提供给工厂创建对象
helpers::Properties props_subset
= appenderProperties.getPropertySubset((*it)
+ LOG4CPLUS_TEXT("."));
try
{
通过由类名找到的工厂类(initializeFactoryRegistry在此函数中注册工厂类),创建append 对象指针
SharedAppenderPtr appender
= factory->createObject(props_subset);
if (! appender)
{
tstring err =
LOG4CPLUS_TEXT("PropertyConfigurator::")
LOG4CPLUS_TEXT("configureAppenders()")
LOG4CPLUS_TEXT("- Failed to create appender: ");
helpers::getLogLog().error(err + *it);
}
else
{
appender->setName(*it);
将创建的append对象指针以类名为key保存到AppenderMap中
appenders[*it] = appender;
}
}
catch(std::exception const & e)
{
tstring err =
LOG4CPLUS_TEXT("PropertyConfigurator::")
LOG4CPLUS_TEXT("configureAppenders()")
LOG4CPLUS_TEXT("- Error while creating Appender: ");
helpers::getLogLog().error(err + LOG4CPLUS_C_STR_TO_TSTRING(e.what()));
}
}
} // end for loop
}
initializeFactoryRegistry函数注册append所有相关类的工厂类,在configureAppenders()使用这些工厂类创建相应的对象
void initializeFactoryRegistry()
{
spi::AppenderFactoryRegistry& reg = spi::getAppenderFactoryRegistry();
LOG4CPLUS_REG_APPENDER (reg, ConsoleAppender);
LOG4CPLUS_REG_APPENDER (reg, NullAppender);
LOG4CPLUS_REG_APPENDER (reg, FileAppender);
LOG4CPLUS_REG_APPENDER (reg, RollingFileAppender);
LOG4CPLUS_REG_APPENDER (reg, DailyRollingFileAppender);
LOG4CPLUS_REG_APPENDER (reg, SocketAppender);