24#include <core/threading/mutex.h>
25#include <core/threading/mutex_locker.h>
26#include <logging/cache.h>
50 max_num_entries_ = num_entries;
53 now_s = (struct ::tm *)malloc(
sizeof(struct ::tm));
64std::list<CacheLogger::CacheEntry> &
85 return max_num_entries_;
95 if (new_size < num_entries_) {
96 num_entries_ = new_size;
97 messages_.resize(num_entries_);
99 max_num_entries_ = new_size;
119CacheLogger::push_message(LogLevel ll,
const char *component,
const char *format, va_list va)
124 gettimeofday(&now, NULL);
125 localtime_r(&now.tv_sec, now_s);
127 if (asprintf(×tr,
128 "%02d:%02d:%02d.%06ld",
138 if (vasprintf(&msg, format, va) == -1) {
146 e.component = component;
150 messages_.push_front(e);
155 if (num_entries_ == max_num_entries_) {
156 messages_.pop_back();
164CacheLogger::push_message(LogLevel ll,
const char *component, Exception &e)
167 MutexLocker
lock(mutex);
169 gettimeofday(&now, NULL);
170 localtime_r(&now.tv_sec, now_s);
172 if (asprintf(×tr,
173 "%02d:%02d:%02d.%06ld",
182 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
185 ce.component = component;
187 ce.timestr = timestr;
188 ce.message = std::string(
"[EXCEPTION] ") + *i;
189 messages_.push_front(ce);
195 if (num_entries_ > max_num_entries_) {
196 num_entries_ = max_num_entries_;
197 messages_.resize(max_num_entries_);
205 push_message(
LL_DEBUG, component, format, va);
211 push_message(
LL_INFO, component, format, va);
217 push_message(
LL_WARN, component, format, va);
223 push_message(
LL_ERROR, component, format, va);
230 va_start(arg, format);
231 push_message(
LL_DEBUG, component, format, arg);
239 va_start(arg, format);
240 push_message(
LL_INFO, component, format, arg);
248 va_start(arg, format);
249 push_message(
LL_WARN, component, format, arg);
257 va_start(arg, format);
258 push_message(
LL_ERROR, component, format, arg);
265 push_message(
LL_DEBUG, component, e);
271 push_message(
LL_INFO, component, e);
277 push_message(
LL_WARN, component, e);
283 push_message(
LL_ERROR, component, e);
287CacheLogger::tlog_push_message(LogLevel ll,
289 const char * component,
295 localtime_r(&t->tv_sec, now_s);
297 if (asprintf(×tr,
298 "%02d:%02d:%02d.%06ld",
307 if (vasprintf(&msg, format, va) == -1) {
314 e.component = component;
318 messages_.push_front(e);
323 if (num_entries_ == max_num_entries_) {
324 messages_.pop_back();
333CacheLogger::tlog_push_message(LogLevel ll,
struct timeval *t,
const char *component, Exception &e)
336 MutexLocker
lock(mutex);
337 localtime_r(&t->tv_sec, now_s);
339 if (asprintf(×tr,
340 "%02d:%02d:%02d.%06ld",
348 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
351 ce.component = component;
353 ce.timestr = timestr;
354 ce.message = std::string(
"[EXCEPTION] ") + *i;
355 messages_.push_front(ce);
361 if (num_entries_ > max_num_entries_) {
362 num_entries_ = max_num_entries_;
363 messages_.resize(max_num_entries_);
372 va_start(arg, format);
373 tlog_push_message(
LL_DEBUG, t, component, format, arg);
381 va_start(arg, format);
382 tlog_push_message(
LL_INFO, t, component, format, arg);
390 va_start(arg, format);
391 tlog_push_message(
LL_WARN, t, component, format, arg);
399 va_start(arg, format);
400 tlog_push_message(
LL_ERROR, t, component, format, arg);
407 tlog_push_message(
LL_DEBUG, t, component, e);
413 tlog_push_message(
LL_INFO, t, component, e);
419 tlog_push_message(
LL_WARN, t, component, e);
425 tlog_push_message(
LL_ERROR, t, component, e);
431 tlog_push_message(
LL_DEBUG, t, component, format, va);
437 tlog_push_message(
LL_INFO, t, component, format, va);
443 tlog_push_message(
LL_WARN, t, component, format, va);
449 tlog_push_message(
LL_ERROR, t, component, format, va);
virtual void vtlog_error(struct timeval *t, const char *component, const char *format, va_list va)
Log error message for specific time.
virtual void tlog_debug(struct timeval *t, const char *component, const char *format,...)
Log debug message for specific time.
virtual void log_debug(const char *component, const char *format,...)
Log debug message.
virtual void vtlog_debug(struct timeval *t, const char *component, const char *format, va_list va)
Log debug message for specific time.
virtual void tlog_warn(struct timeval *t, const char *component, const char *format,...)
Log warning message for specific time.
virtual void log_info(const char *component, const char *format,...)
Log informational message.
std::list< CacheEntry > & get_messages()
Get messages.
void clear()
Clear messages.
unsigned int size() const
Get maximum number of log entries in cache.
virtual void vtlog_info(struct timeval *t, const char *component, const char *format, va_list va)
Log informational message for specific time.
virtual void vlog_error(const char *component, const char *format, va_list va)
Log error message.
void lock()
Lock cache logger, no new messages can be added.
virtual void log_warn(const char *component, const char *format,...)
Log warning message.
void set_size(unsigned int new_size)
Set maximum number of log entries in cache.
virtual void vlog_debug(const char *component, const char *format, va_list va)
Log debug message.
void unlock()
Unlock cache logger.
virtual void tlog_info(struct timeval *t, const char *component, const char *format,...)
Log informational message for specific time.
CacheLogger(unsigned int num_entries=20, LogLevel log_level=LL_DEBUG)
Constructor.
virtual void vlog_warn(const char *component, const char *format, va_list va)
Log warning message.
virtual ~CacheLogger()
Destructor.
virtual void log_error(const char *component, const char *format,...)
Log error message.
virtual void vtlog_warn(struct timeval *t, const char *component, const char *format, va_list va)
Log warning message for specific time.
virtual void vlog_info(const char *component, const char *format, va_list va)
Log informational message.
virtual void tlog_error(struct timeval *t, const char *component, const char *format,...)
Log error message for specific time.
Base class for exceptions in Fawkes.
@ LL_INFO
informational output about normal procedures
@ LL_WARN
warning, should be investigated but software still functions, an example is that something was reques...
@ LL_ERROR
error, may be recoverable (software still running) or not (software has to terminate).
@ LL_DEBUG
debug output, relevant only when tracking down problems
LogLevel log_level
Minimum log level.
Mutex mutual exclusion lock.
void lock()
Lock this mutex.
void unlock()
Unlock the mutex.
Fawkes library namespace.