歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

改進後的日志類CLogger

在原有的基礎上增加了module_name,表示模塊名,當一個系統由多模塊組成時,輸出的日志將更加清晰,使用方法,以MOOON-agent中的為例:

/** 不要修改下面的常量值,而應當通過對應的方法去修改
* 這些常量值主要是方便多模塊共享,故放在這個公有頭文件當中
*/
enum
{
LOG_LINE_SIZE_MIN = 256, /** 日志行最小長度 */
LOG_LINE_SIZE_MAX = 32768, /** 日志行最大長度(32K) ,最大不能超過64K,因為使用2字節無符號整數存儲的 */
DEFAULT_LOG_FILE_SIZE = 104857600, /** 默認的單個日志文件大小(100MB) */
DEFAULT_LOG_FILE_BACKUP_NUMBER = 10 /** 默認的日志文件備份個數 */
};

/** 定義日志級別 */
typedef enum
{
LOG_LEVEL_DETAIL = 0,
LOG_LEVEL_DEBUG = 1,
LOG_LEVEL_INFO = 2,
LOG_LEVEL_WARN = 3,
LOG_LEVEL_ERROR = 4,
LOG_LEVEL_FATAL = 5,
LOG_LEVEL_STATE = 6, /** 僅輸出狀態數據 */
LOG_LEVEL_TRACE = 7
}log_level_t;

/** 通過日志級別名得到日志級別 */
extern log_level_t get_log_level(const char* level_name);
/** 通過日志級別得到日志級別名,如果傳入錯誤的日志級別,則返回NULL */
extern const char* get_log_level_name(log_level_t log_level);

/**
* 日志器接口,提供常見的寫日志功能
*/
class ILogger
{
public:
/** 空虛擬析構函數,以屏蔽編譯器告警 */
virtual ~ILogger() {}

/** 是否允許同時在標准輸出上打印日志 */
virtual void enable_screen(bool enabled) {}
/** 是否允許二進制日志,二進制日志必須通過它來打開 */
virtual void enable_bin_log(bool enabled) {}
/** 是否允許跟蹤日志,跟蹤日志必須通過它來打開 */
virtual void enable_trace_log(bool enabled) {}
/** 是否自動在一行後添加結尾的點號,如果最後已經有點號或換符符,則不會再添加 */
virtual void enable_auto_adddot(bool enabled) {}
/** 是否自動添加換行符,如果已經有換行符,則不會再自動添加換行符 */
virtual void enable_auto_newline(bool enabled) {}
/** 設置日志級別,跟蹤日志級別不能通過它來設置 */
virtual void set_log_level(log_level_t log_level) {}
/** 設置單個文件的最大建議大小 */
virtual void set_single_filesize(uint32_t filesize) {}
/** 設置日志文件備份個數,不包正在寫的日志文件 */
virtual void set_backup_number(uint16_t backup_number) {}

/** 是否允許二進制日志 */
virtual bool enabled_bin() { return false; }
/** 是否允許Detail級別日志 */
virtual bool enabled_detail() { return false; }
/** 是否允許Debug級別日志 */
virtual bool enabled_debug() { return false; }
/** 是否允許Info級別日志 */
virtual bool enabled_info() { return false; }
/** 是否允許Warn級別日志 */
virtual bool enabled_warn() { return false; }
/** 是否允許Error級別日志 */
virtual bool enabled_error() { return false; }
/** 是否允許Fatal級別日志 */
virtual bool enabled_fatal() { return false; }
/** 是否允許輸出狀態日志 */
virtual bool enabled_state() { return false; }
/** 是否允許Trace級別日志 */
virtual bool enabled_trace() { return false; }

virtual void log_detail(const char* filename, int lineno, const char* module_name, const char* format, ...) {}
virtual void log_debug(const char* filename, int lineno, const char* module_name, const char* format, ...) {}
virtual void log_info(const char* filename, int lineno, const char* module_name, const char* format, ...) {}
virtual void log_warn(const char* filename, int lineno, const char* module_name, const char* format, ...) {}
virtual void log_error(const char* filename, int lineno, const char* module_name, const char* format, ...) {}
virtual void log_fatal(const char* filename, int lineno, const char* module_name, const char* format, ...) {}
virtual void log_state(const char* filename, int lineno, const char* module_name, const char* format, ...) {}
virtual void log_trace(const char* filename, int lineno, const char* module_name, const char* format, ...) {}

/** 寫二進制日志 */
virtual void bin_log(const char* filename, int lineno, const char* module_name, const char* log, uint16_t size) {}
};

//////////////////////////////////////////////////////////////////////////
// 日志宏,方便記錄日志
extern ILogger* g_logger; // 只是聲明,不是定義,不能賦值哦!

#define __MYLOG_DETAIL(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf("[DETAIL][%s:%d]", __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_detail()) { \
logger->log_detail(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_DEBUG(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf(PRINT_COLOR_DARY_GRAY"[DEBUG][%s:%d]"PRINT_COLOR_NONE, __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_debug()) { \
logger->log_debug(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_INFO(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf("[INFO][%s:%d]", __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_info()) { \
logger->log_info(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_WARN(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf(PRINT_COLOR_YELLOW"[WARN][%s:%d]"PRINT_COLOR_NONE, __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_warn()) { \
logger->log_warn(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_ERROR(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf(PRINT_COLOR_RED"[ERROR][%s:%d]"PRINT_COLOR_NONE, __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_error()) { \
logger->log_error(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_FATAL(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf(PRINT_COLOR_BROWN"[FATAL][%s:%d]"PRINT_COLOR_NONE, __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_fatal()) { \
logger->log_fatal(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_STATE(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf("[STATE][%s:%d]", __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_state()) { \
logger->log_state(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_TRACE(logger, module_name, format, ...) \
do { \
if (NULL == logger) { \
printf("[TRACE][%s:%d]", __FILE__, __LINE__); \
printf(format, ##__VA_ARGS__); \
} \
else if (logger->enabled_trace()) { \
logger->log_trace(__FILE__, __LINE__, module_name, format, ##__VA_ARGS__); \
} \
} while(false)

#define __MYLOG_BIN(logger, module_name, log, size) \
do { \
if ((logger != NULL) && logger->enabled_bin()) \
logger->bin_log(__FILE__, __LINE__, module_name, log, size); \
} while(false)

#define MYLOG_BIN(log, size) __MYLOG_BIN(sys::g_logger, log, size)
#define MYLOG_TRACE(format, ...) __MYLOG_TRACE(sys::g_logger, NULL, format, ##__VA_ARGS__)
#define MYLOG_STATE(format, ...) __MYLOG_STATE(sys::g_logger, NULL, format, ##__VA_ARGS__)
#define MYLOG_FATAL(format, ...) __MYLOG_FATAL(sys::g_logger, NULL, format, ##__VA_ARGS__)
#define MYLOG_ERROR(format, ...) __MYLOG_ERROR(sys::g_logger, NULL, format, ##__VA_ARGS__)
#define MYLOG_WARN(format, ...) __MYLOG_WARN(sys::g_logger, NULL, format, ##__VA_ARGS__)
#define MYLOG_INFO(format, ...) __MYLOG_INFO(sys::g_logger, NULL, format, ##__VA_ARGS__)
#define MYLOG_DEBUG(format, ...) __MYLOG_DEBUG(sys::g_logger, NULL, format, ##__VA_ARGS__)
#define MYLOG_DETAIL(format, ...) __MYLOG_DETAIL(sys::g_logger, NULL, format, ##__VA_ARGS__)

本文出自 “飛月” 博客,請務必保留此出處http://mooon.blog.51cto.com/1246491/941082

Copyright © Linux教程網 All Rights Reserved