10 #include <boost/predef.h>
12 # if (BOOST_COMP_MSVC >= BOOST_VERSION_NUMBER(14, 0, 0))
13 # define _ENABLE_ATOMIC_ALIGNMENT_FIX
19 #include <boost/lexical_cast.hpp>
20 #include <boost/lockfree/queue.hpp>
21 #include <boost/lambda/algorithm.hpp>
23 #include <qi/application.hpp>
24 #include <qi/anymodule.hpp>
25 #include <qi/anyobject.hpp>
26 #include <qi/type/objecttypebuilder.hpp>
28 #include <qi/getenv.hpp>
38 const bool debug = (!qi::os::getenv(
"LOG_DEBUG").empty());
43 std::cerr << a << std::endl; \
50 boost::lockfree::queue<qi::LogMessage*>
_pendingMessages(qi::os::getEnvDefault(
"QI_LOG_MAX_MSGS_BUFFERS", 500));
59 return boost::shared_ptr<qi::LogProviderImpl>(
new LogProviderImpl(logger));
64 DEBUG(
"LP removeProviderAtStop " <<
id);
66 lm->removeProvider(
id);
72 DEBUG(
"registering new provider");
74 throw std::runtime_error(
"Provider already registered for this process");
78 if (!categoryPrefix.empty())
79 instance->setCategoryPrefix(categoryPrefix);
81 qi::Future<int>
id = lm.async<
int>(
"addProvider", instance);
82 DEBUG(
"LP registerToLogger " << instance.uid());
87 return id.then(boost::lambda::constant(instance));
94 ::qi::log::addFilter(
"qitype.*", qi::LogLevel_Silent, subscriber);
95 ::qi::log::addFilter(
"qimessaging.*", qi::LogLevel_Silent, subscriber);
96 ::qi::log::addFilter(
"qi.*", qi::LogLevel_Silent, subscriber);
102 DEBUG(
"LP subscribed this " <<
this);
104 qi::log::addHandler(
"remoteLogger", boost::bind(&
LogProviderImpl::log,
this, _1, _2, _3, _4, _5, _6, _7, _8));
116 : _logger(std::move(logger))
118 DEBUG(
"LP subscribed this " <<
this);
120 qi::log::addHandler(
"remoteLogger", boost::bind(&
LogProviderImpl::log,
this, _1, _2, _3, _4, _5, _6, _7, _8));
133 DEBUG(
"LP ~LogProviderImpl");
136 qi::log::removeHandler(
"remoteLogger");
148 DEBUG(
"LP sendLogs");
149 std::vector<qi::LogMessage> msgs;
153 msgs.push_back(*msg);
160 catch (
const std::exception& e)
168 const Clock::time_point date,
169 const SystemClock::time_point systemDate,
170 const char* category,
173 const char*
function,
176 DEBUG(
"LP log callback: " << message <<
" " << file <<
" " <<
function);
181 std::string source(file);
185 source += boost::lexical_cast<std::string>(line);
194 msg->
location = qi::os::getMachineId() +
":" + boost::lexical_cast<std::string>(qi::os::getpid());
200 DEBUG(
"LP:log done");
205 DEBUG(
"LP setCategoryPrefix " << categoryPrefix);
211 DEBUG(
"LP verb " << level);
217 DEBUG(
"LP addFilter level: " << level <<
" cat: " << filter);
227 DEBUG(
"LP setFilters");
233 ::qi::log::addFilter(*it, qi::LogLevel_Debug,
_subscriber);
238 qi::LogLevel wildcardLevel = qi::LogLevel_Silent;
239 bool wildcardIsSet =
false;
240 for (
unsigned i = 0; i < filters.size(); ++i)
242 if (filters[i].first ==
"*")
244 wildcardLevel = filters[i].second;
245 wildcardIsSet =
true;
248 addFilter(filters[i].first, filters[i].second);
254 ::qi::log::addFilter(
"*", wildcardLevel,
_subscriber);
266 mb->advertiseMethod(
"initializeLogging", (boost::function<qi::FutureSync<qi::LogProviderPtr> (SessionPtr)>(boost::bind(&
initializeLogging, _1,
""))));