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());
219 LoggerPtr LoggerFactory::getLogger(
const string& name) {
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);
boost::recursive_mutex & mutex
boost::shared_ptr< LoggerProxy > LoggerProxyPtr
Objects of this class parse streams that contain configuration information in "ini-file" syntax...
bool visit(const LoggerTreeNode::NamePath &path, LoggerTreeNodePtr node, const Logger::Level &)
Called for each node in the tree.
Visitor interface to operate on the tree.
bool visit(const LoggerTreeNode::NamePath &, LoggerTreeNodePtr node, const Logger::Level &)
Called for each node in the tree.
A simple tree representation for loggers.
void provideOptions(OptionHandler &handler)
Implementations should pass all configuration options to handler.
ReconfigurationVisitor(const Logger::Level &newLevel)
A Visitor that propagates a logging level down the logger tree but stops if a logger already as a lev...
std::vector< std::string > NamePath
A unique representation of a name.
Level
Possible logging levels.
void call(LoggerProxyPtr, const Logger::Level &level)
boost::shared_ptr< LoggingSystem > newSystem
A proxy to an instance of Logger, which provides the same interface but allows to exchange the underl...
rsc::misc::Registry< LoggingSystem > * loggingSystemRegistry()
ReselectVisitor(boost::shared_ptr< LoggingSystem > newSystem)
virtual ~TreeLevelUpdater()
bool visit(const LoggerTreeNode::NamePath &, LoggerTreeNodePtr node, const Logger::Level &)
Called for each node in the tree.
boost::shared_ptr< SetLevelCallback > SetLevelCallbackPtr
LoggerTreeNodeWeakPtr treeNode
boost::shared_ptr< LoggerTreeNode > LoggerTreeNodePtr
LevelSetter(const Logger::Level &level)
boost::shared_ptr< Visitor > VisitorPtr
TreeLevelUpdater(LoggerTreeNodeWeakPtr treeNode, boost::recursive_mutex &mutex)
Interface for callbacks which are invoked when someone calls setLevel on this proxy.
A class which configures the logging tree using configuration subsystem of RSC.
boost::weak_ptr< LoggerTreeNode > LoggerTreeNodeWeakPtr
boost::shared_ptr< Logger > LoggerPtr