Apache Log4cxx: com/foo/config3.cpp (original) (raw)

This file is an example of how to use the current module name to select the Log4cxx configuration file.

#include "config.h"

#ifdef _WIN32

#include <windows.h>

#elif __APPLE__

#include <mach-o/dyld.h>

#elif (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L)

#include <unistd.h>

#else

#include

#endif

namespace {

auto DefaultConfigurationFileNames(std::string& altPrefix) -> std::vectorstd::string {

std::vectorstd::string result;

static const int bufSize = 4096;

char buf[bufSize+1] = {0}, pathSepar = '/';

uint32_t bufCount = 0;

#if defined(_WIN32)

GetModuleFileName(NULL, buf, bufSize);

pathSepar = '\\';

#elif defined(__APPLE__)

_NSGetExecutablePath(buf, &bufCount);

#elif (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L)

std::ostringstream exeLink;

exeLink << "/proc/" << getpid() << "/exe";

bufCount = readlink(exeLink.str().c_str(), buf, bufSize);

if (0 < bufCount)

buf[bufCount] = 0;

#else

strncpy(buf, "auto-configured", bufSize);

#endif

std::string programFileName(buf);

auto slashIndex = programFileName.rfind(pathSepar);

if (std:🧵:npos != slashIndex) {

altPrefix = programFileName.substr(0, slashIndex + 1);

if (helpers::LogLog::isDebugEnabled())

{

LogString msg = LOG4CXX_STR("Alternate prefix [");

helpers::Transcoder::decode(altPrefix, msg);

msg += LOG4CXX_STR("]");

helpers::LogLog::debug(msg);

}

result.push_back(programFileName.substr(slashIndex + 1));

if (helpers::LogLog::isDebugEnabled())

{

LogString msg(LOG4CXX_STR("Alternate configuration file name ["));

helpers::Transcoder::decode(result.back(), msg);

msg += LOG4CXX_STR("]");

helpers::LogLog::debug(msg);

}

auto dotIndex = result.back().rfind('.');

if (std:🧵:npos != dotIndex)

{

result.push_back(result.back());

result.back().erase(dotIndex);

if (helpers::LogLog::isDebugEnabled())

{

LogString msg(LOG4CXX_STR("Alternate configuration file name ["));

helpers::Transcoder::decode(result.back(), msg);

msg += LOG4CXX_STR("]");

helpers::LogLog::debug(msg);

}

}

}

else if (!programFileName.empty()) {

auto dotIndex = result.back().rfind('.');

if (std:🧵:npos != dotIndex) {

programFileName.erase(dotIndex);

result.push_back(programFileName);

if (helpers::LogLog::isDebugEnabled())

{

LogString msg(LOG4CXX_STR("Alternate configuration file name ["));

helpers::Transcoder::decode(result.back(), msg);

msg += LOG4CXX_STR("]");

helpers::LogLog::debug(msg);

}

}

}

result.push_back("log4cxx");

result.push_back("log4j");

return result;

}

void SelectConfigurationFile() {

#if defined(_DEBUG)

helpers::LogLog::setInternalDebugging(true);

#endif

const char* extension[] = { ".xml", ".properties", 0 };

std::string altPrefix;

for (auto baseName : DefaultConfigurationFileNames(altPrefix)) {

int i = 0;

for (; extension[i]; ++i) {

File current_working_dir_candidate(baseName + extension[i]);

if (current_working_dir_candidate.exists(pool)) {

DefaultConfigurator::setConfigurationFileName(current_working_dir_candidate.getPath());

DefaultConfigurator::setConfigurationWatchSeconds(5);

break;

}

if (!altPrefix.empty()) {

File alt_dir_candidate(altPrefix + baseName + extension[i]);

if (alt_dir_candidate.exists(pool)) {

DefaultConfigurator::setConfigurationFileName(alt_dir_candidate.getPath());

DefaultConfigurator::setConfigurationWatchSeconds(5);

break;

}

}

}

if (extension[i])

return;

}

BasicConfigurator::configure();

}

}

namespace com { namespace foo {

auto getLogger(const std::string& name) -> LoggerPtr {

static struct log4cxx_initializer {

log4cxx_initializer() {

SelectConfigurationFile();

}

~log4cxx_initializer() {

LogManager::shutdown();

}

} initialiser;

return name.empty()

? LogManager::getRootLogger()

}

} }

An abstract representation of file and directory path names.

Definition: file.h:41

bool exists(log4cxx::helpers::Pool &p) const

Determines if file exists.

LogString getPath() const

Get file path.

Use the LogManager class to retreive Logger instances or to operate on the current LoggerRepository.

Definition: logmanager.h:45

Definition: configuration.h:25

std::basic_string< logchar > LogString

Definition: logstring.h:60

std::shared_ptr< Logger > LoggerPtr

Definition: defaultloggerfactory.h:27