log4cplus代码详解(一) configureAppenders

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 appendersProps = appenderProperties.propertyNames();
    tstring factoryName;
    printf("configureAppenders\n");
    for(std::vector::iterator it=appendersProps.begin();
        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);

你可能感兴趣的:(linux,log,log4cplus)