#ifndef _XCELOG_H_ #define _XCELOG_H_ #include "tlog.h" #include static pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER; static int xce_log_initialized = 0; typedef enum { XCE_LOG_DEBUG3 = TLOG_DEBUG3, XCE_LOG_DEBUG2 = TLOG_DEBUG2, XCE_LOG_DEBUG = TLOG_DEBUG, XCE_LOG_INFO = TLOG_INFO, XCE_LOG_NOTICE = TLOG_NOTICE, XCE_LOG_WARN = TLOG_WARN, XCE_LOG_ERROR = TLOG_ERROR, XCE_LOG_FATAL = TLOG_FATAL, XCE_LOG_OFF = TLOG_OFF, XCE_LOG_END = TLOG_END } LogLevel; static inline int xce_init_xcecd_log(const char* log_file, int log_size, int log_level) { int ret; pthread_mutex_lock(&log_mutex); if (!xce_log_initialized) { ret = tlog_init(log_file, log_size, 6, 0, 0); if (ret != 0) { tlog(TLOG_ERROR, "XCECD start tlog failed.\n"); return -1; } tlog_setlevel(log_level); xce_log_initialized = 1; } pthread_mutex_unlock(&log_mutex); return 0; } static inline int xce_init_xcecdwk_log(const char* log_file, int log_size, int log_level) { int ret; pthread_mutex_lock(&log_mutex); if (!xce_log_initialized) { ret = tlog_init(log_file, log_size, 6, 0, 0); if (ret != 0) { tlog(TLOG_ERROR, "XCECD_WORKER start tlog failed.\n"); return -1; } tlog_setlevel(log_level); xce_log_initialized = 1; } pthread_mutex_unlock(&log_mutex); return 0; } #define XCECD_LOG(level, format, ...) \ do { \ pthread_mutex_lock(&log_mutex); \ tlog((int)(level), format __VA_OPT__(, ) __VA_ARGS__); \ pthread_mutex_unlock(&log_mutex); \ } while (0) #define XCECD_WORKER_LOG(level, format, ...) \ do { \ pthread_mutex_lock(&log_mutex); \ tlog((int)(level), format __VA_OPT__(, ) __VA_ARGS__); \ pthread_mutex_unlock(&log_mutex); \ } while (0) /* For different XCE modules we can have customized macros. Here is an example * of XCECD log micro. */ #define CONTROLLER_LOG(level, format, ...) \ tlog((int)level, format __VA_OPT__(, ) __VA_ARGS__) #define SCHEDULER_LOG(level, format, ...) \ tlog((int)level, format __VA_OPT__(, ) __VA_ARGS__) static inline void xce_log_fini() { tlog_exit(); } #endif