25 #include <boost/log/expressions.hpp>
45 this->setDestinationImpl(shared_ptr<std::ostream>(&std::clog, bind([]{})));
47 const char* environ = std::getenv(
"NDN_LOG");
48 if (environ !=
nullptr) {
49 this->setLevelImpl(environ);
54 Logging::addLoggerImpl(Logger& logger)
56 std::lock_guard<std::mutex> lock(m_mutex);
58 const std::string& moduleName = logger.getModuleName();
59 m_loggers.insert({moduleName, &logger});
61 auto levelIt = m_enabledLevel.find(moduleName);
62 if (levelIt == m_enabledLevel.end()) {
63 levelIt = m_enabledLevel.find(
"*");
65 LogLevel level = levelIt == m_enabledLevel.end() ? INITIAL_DEFAULT_LEVEL : levelIt->second;
66 logger.setLevel(level);
69 #ifdef NDN_CXX_HAVE_TESTS
71 Logging::removeLogger(Logger& logger)
73 const std::string& moduleName = logger.getModuleName();
74 auto range = m_loggers.equal_range(moduleName);
75 for (
auto i = range.first; i != range.second; ++i) {
76 if (i->second == &logger) {
83 #endif // NDN_CXX_HAVE_TESTS
86 Logging::setLevelImpl(
const std::string& moduleName,
LogLevel level)
88 std::lock_guard<std::mutex> lock(m_mutex);
90 if (moduleName ==
"*") {
91 this->setDefaultLevel(level);
95 m_enabledLevel[moduleName] = level;
96 auto range = m_loggers.equal_range(moduleName);
97 for (
auto i = range.first; i != range.second; ++i) {
98 i->second->setLevel(level);
103 Logging::setDefaultLevel(
LogLevel level)
105 m_enabledLevel.clear();
106 m_enabledLevel[
"*"] = level;
108 for (
auto i = m_loggers.begin(); i != m_loggers.end(); ++i) {
109 i->second->setLevel(level);
114 Logging::setLevelImpl(
const std::string& config)
116 std::stringstream ss(config);
117 std::string configModule;
118 while (std::getline(ss, configModule,
':')) {
119 size_t ind = configModule.find(
'=');
120 if (ind == std::string::npos) {
121 BOOST_THROW_EXCEPTION(std::invalid_argument(
"malformed logging config: '=' is missing"));
124 std::string moduleName = configModule.substr(0, ind);
127 this->setLevelImpl(moduleName, level);
131 #ifdef NDN_CXX_HAVE_TESTS
133 Logging::getLevels()
const
135 std::ostringstream os;
137 auto defaultLevelIt = m_enabledLevel.find(
"*");
138 if (defaultLevelIt != m_enabledLevel.end()) {
139 os <<
"*=" << defaultLevelIt->second <<
':';
142 for (
auto it = m_enabledLevel.begin(); it != m_enabledLevel.end(); ++it) {
143 if (it->first ==
"*") {
146 os << it->first <<
'=' << it->second <<
':';
149 std::string s = os.str();
155 #endif // NDN_CXX_HAVE_TESTS
157 #ifdef NDN_CXX_HAVE_TESTS
159 Logging::resetLevels()
161 this->setDefaultLevel(INITIAL_DEFAULT_LEVEL);
162 m_enabledLevel.clear();
164 #endif // NDN_CXX_HAVE_TESTS
173 Logging::setDestinationImpl(shared_ptr<std::ostream> os)
175 std::lock_guard<std::mutex> lock(m_mutex);
179 auto backend = boost::make_shared<boost::log::sinks::text_ostream_backend>();
180 backend->auto_flush(
true);
181 backend->add_stream(boost::shared_ptr<std::ostream>(os.get(), bind([]{})));
183 if (m_sink !=
nullptr) {
184 boost::log::core::get()->remove_sink(m_sink);
189 m_sink = boost::make_shared<Sink>(backend);
190 m_sink->set_formatter(boost::log::expressions::stream << boost::log::expressions::message);
191 boost::log::core::get()->add_sink(m_sink);
194 #ifdef NDN_CXX_HAVE_TESTS
195 shared_ptr<std::ostream>
196 Logging::getDestination()
198 return m_destination;
200 #endif // NDN_CXX_HAVE_TESTS
controls the logging facility
Copyright (c) 2013-2016 Regents of the University of California.
static void setDestination(shared_ptr< std::ostream > os)
set log destination
LogLevel
indicates the severity level of a log message
LogLevel parseLogLevel(const std::string &s)
parse LogLevel from string
static const LogLevel INITIAL_DEFAULT_LEVEL