directly forward messages to sinks until Thread is started
This commit is contained in:
+38
-26
@@ -181,14 +181,18 @@ Logger& Logger::operator-=(const LogSink* sink)
|
|||||||
|
|
||||||
void Logger::log(const int area, const int level, const string& data, ...)
|
void Logger::log(const int area, const int level, const string& data, ...)
|
||||||
{
|
{
|
||||||
if (isRunning() == true) {
|
if (m_direct == true || isRunning() == true) {
|
||||||
char* tmp;
|
char* tmp;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, data);
|
va_start(ap, data);
|
||||||
|
|
||||||
if (vasprintf(&tmp, data.c_str(), ap) != -1) {
|
if (vasprintf(&tmp, data.c_str(), ap) != -1) {
|
||||||
string buffer(tmp);
|
string buffer(tmp);
|
||||||
m_logQueue.add(new LogMessage(area, level, buffer));
|
LogMessage* message = new LogMessage(area, level, buffer);
|
||||||
|
if (m_direct == true)
|
||||||
|
handleMessage(message);
|
||||||
|
else
|
||||||
|
m_logQueue.add(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@@ -197,34 +201,42 @@ void Logger::log(const int area, const int level, const string& data, ...)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Logger::handleMessage(LogMessage* message) {
|
||||||
|
bool running = true;
|
||||||
|
sinkCI_t iter = m_sinks.begin();
|
||||||
|
|
||||||
|
for (; iter != m_sinks.end(); ++iter) {
|
||||||
|
if (*iter != 0) {
|
||||||
|
|
||||||
|
if ((((*iter)->getAreaMask() & (1 << message->getArea())) != 0
|
||||||
|
&& (*iter)->getLevel() >= message->getLevel())
|
||||||
|
&& message->isRunning() == true) {
|
||||||
|
(*iter)->addMessage(*message);
|
||||||
|
}
|
||||||
|
else if (message->isRunning() == false) {
|
||||||
|
(*iter)->addMessage(*message);
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete message;
|
||||||
|
|
||||||
|
return running;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Logger::start(const char* name)
|
||||||
|
{
|
||||||
|
m_direct = false;
|
||||||
|
return Thread::start(name);
|
||||||
|
}
|
||||||
|
|
||||||
void Logger::run()
|
void Logger::run()
|
||||||
{
|
{
|
||||||
bool running = true;
|
|
||||||
|
|
||||||
do {
|
while (handleMessage(m_logQueue.remove()));
|
||||||
LogMessage* message = m_logQueue.remove();
|
|
||||||
|
|
||||||
sinkCI_t iter = m_sinks.begin();
|
|
||||||
|
|
||||||
for (; iter != m_sinks.end(); ++iter) {
|
|
||||||
if (*iter != 0) {
|
|
||||||
|
|
||||||
if ((((*iter)->getAreaMask() & (1 << message->getArea())) != 0
|
|
||||||
&& (*iter)->getLevel() >= message->getLevel())
|
|
||||||
&& message->isRunning() == true) {
|
|
||||||
(*iter)->addMessage(*message);
|
|
||||||
}
|
|
||||||
else if (message->isRunning() == false) {
|
|
||||||
(*iter)->addMessage(*message);
|
|
||||||
running = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete message;
|
|
||||||
|
|
||||||
} while (running == true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::stop()
|
void Logger::stop()
|
||||||
|
|||||||
+14
-1
@@ -298,6 +298,9 @@ public:
|
|||||||
*/
|
*/
|
||||||
LogSink* getSink(const int index) const { return(m_sinks[index]); }
|
LogSink* getSink(const int index) const { return(m_sinks[index]); }
|
||||||
|
|
||||||
|
//@copydoc
|
||||||
|
virtual bool start(const char* name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief endless loop for logger instance.
|
* @brief endless loop for logger instance.
|
||||||
*/
|
*/
|
||||||
@@ -312,7 +315,7 @@ private:
|
|||||||
/**
|
/**
|
||||||
* @brief private construtor.
|
* @brief private construtor.
|
||||||
*/
|
*/
|
||||||
Logger() {}
|
Logger() : m_direct(true) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief private copy construtor.
|
* @brief private copy construtor.
|
||||||
@@ -327,12 +330,22 @@ private:
|
|||||||
*/
|
*/
|
||||||
Logger& operator=(const Logger&);
|
Logger& operator=(const Logger&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Distribute the @a LogMessage to all known sinks and delete it afterwards.
|
||||||
|
* @param mesage the @a LogMessage to distribute.
|
||||||
|
* @return true to continue running, false to stop.
|
||||||
|
*/
|
||||||
|
bool handleMessage(LogMessage* message);
|
||||||
|
|
||||||
/** typedefs for a vector of type LogSink* */
|
/** typedefs for a vector of type LogSink* */
|
||||||
typedef vector<LogSink*> sink_t;
|
typedef vector<LogSink*> sink_t;
|
||||||
|
|
||||||
/** typedefs for a vector of type LogSink* iterator */
|
/** typedefs for a vector of type LogSink* iterator */
|
||||||
typedef vector<LogSink*>::iterator sinkCI_t;
|
typedef vector<LogSink*>::iterator sinkCI_t;
|
||||||
|
|
||||||
|
/** true to directly log to all sinks, false to buffer via @a m_logQueue. */
|
||||||
|
bool m_direct;
|
||||||
|
|
||||||
/** vector of available logging sinks */
|
/** vector of available logging sinks */
|
||||||
sink_t m_sinks;
|
sink_t m_sinks;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user