Search code examples
c++cmakepropertieslog4jlog4cxx

Log4cxx properties file variable substitution


I have a properties file for log4cxx configuration with a variable name ${name}:

Properties file example:

log4j.rootLogger=INFO, FILE

# FILE
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=./${name}
log4j.appender.FILE.MaxFileSize=16MB
log4j.appender.FILE.MaxBackupIndex=10
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %m%n

How can I set the variable ${name} from my cpp file or cmake file. I tried with the following code but it doesn't work:

#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/properties.h>

using namespace log4cxx;

static LoggerPtr logger(Logger::getLogger(""));

int main() {
    PropertyConfigurator::configure("./assets/logger.properties");

#ifndef NDEBUG
    logger->setLevel(log4cxx::Level::getDebug());
#endif

    return EXIT_SUCCESS;
}

Thanks in advance


Solution

  • Found out the solution: Use setenv from stdlib. Here is the working solution:

    #include <stdlib.h> // Include the library
    #include <log4cxx/logger.h>
    #include <log4cxx/propertyconfigurator.h>
    #include <log4cxx/helpers/properties.h>
    
    using namespace log4cxx;
    
    static LoggerPtr logger(Logger::getLogger(""));
    
    int main() {
        // Set the env variable
        // The identifier must be the same as the one in the log4cxx configuration file
        setenv("name", "NAME_OF_THE_CURRENT_LOG_FILE", true);
    
        PropertyConfigurator::configure("./assets/logger.properties");
    
    #ifndef NDEBUG
        logger->setLevel(log4cxx::Level::getDebug());
    #endif
    
        return EXIT_SUCCESS;
    }
    

    I hope it was useful not only for me :)