31 #include <boost/bind.hpp>
32 #include <boost/enable_shared_from_this.hpp>
33 #include <boost/filesystem/fstream.hpp>
34 #include <boost/format.hpp>
35 #include <boost/function.hpp>
36 #include <boost/algorithm/string.hpp>
41 #include "../config/ConfigFileSource.h"
42 #include "../runtime/ContainerIO.h"
45 using namespace rsc::misc;
50 const string LoggerFactory::DEFAULT_LOGGING_SYSTEM =
51 ConsoleLoggingSystem::getLoggerName();
52 const Logger::Level LoggerFactory::DEFAULT_LEVEL = Logger::LEVEL_WARN;
79 if (node->getAssignedLevel()) {
83 node->getLoggerProxy()->getLogger()->setLevel(level);
94 boost::recursive_mutex& mutex) :
95 treeNode(treeNode), mutex(mutex) {
103 boost::recursive_mutex::scoped_lock lock(mutex);
105 node->getLoggerProxy()->getLogger()->setLevel(level);
106 node->setAssignedLevel(level);
118 LoggerFactory::LoggerFactory() {
119 reselectLoggingSystem();
121 LoggerPtr logger(loggingSystem->createLogger(
""));
129 loggerTree->setLoggerProxy(proxy);
133 logger->setLevel(DEFAULT_LEVEL);
134 loggerTree->setAssignedLevel(DEFAULT_LEVEL);
137 LoggerFactory::~LoggerFactory() {
144 newSystem(newSystem) {
150 node->getLoggerProxy()->getLogger()->getLevel();
151 node->getLoggerProxy()->setLogger(
152 newSystem->createLogger(LoggerTreeNode::pathToName(path)));
153 node->getLoggerProxy()->getLogger()->setLevel(oldLevel);
160 void LoggerFactory::reselectLoggingSystem(
const std::string& nameHint) {
163 assert(keys.count(DEFAULT_LOGGING_SYSTEM));
166 if (nameHint == DEFAULT_LOGGING_SYSTEM) {
169 systemName = DEFAULT_LOGGING_SYSTEM;
171 }
else if (!nameHint.empty() && keys.count(nameHint)) {
174 systemName = nameHint;
179 if (keys.size() > 1) {
181 keys.erase(DEFAULT_LOGGING_SYSTEM);
183 systemName = *(keys.begin());
187 boost::recursive_mutex::scoped_lock lock(mutex);
193 const Logger::Level oldLevel = loggerTree->getLoggerProxy()->getLevel();
194 loggerTree->getLoggerProxy()->setLogger(
195 loggingSystem->createLogger(
""));
196 loggerTree->getLoggerProxy()->getLogger()->setLevel(oldLevel);
206 loggingSystem->createLogger(LoggerTreeNode::pathToName(path)));
215 node->getParent()->getLoggerProxy()->getLogger()->getLevel());
220 boost::recursive_mutex::scoped_lock lock(mutex);
223 return loggerTree->getLoggerProxy();
226 boost::bind(&LoggerFactory::createLogger,
this, _1, _2));
227 return node->getLoggerProxy();
239 if (node->hasAssignedLevel()) {
240 node->setAssignedLevel(newLevel);
242 node->getLoggerProxy()->getLogger()->setLevel(newLevel);
251 boost::recursive_mutex::scoped_lock lock(mutex);
252 loggerTree->getLoggerProxy()->getLogger()->setLevel(level);
253 loggerTree->setAssignedLevel(level);
258 string LoggerFactory::getLoggingSystemName() {
259 boost::recursive_mutex::scoped_lock lock(mutex);
260 return loggingSystem->getRegistryKey();
263 void LoggerFactory::clearKnownLoggers() {
264 boost::recursive_mutex::scoped_lock lock(mutex);
265 loggerTree->clearChildren();
268 void LoggerFactory::reconfigureFromFile(
const string& fileName) {
270 boost::filesystem::ifstream stream(fileName);
272 throw invalid_argument(
"Unable to open file " + fileName);