改进后的日志类CLogger
来源:互联网 发布:数据录入 招聘 编辑:程序博客网 时间:2024/05/18 03:47
在原有的基础上增加了module_name,表示模块名,当一个系统由多模块组成时,输出的日志将更加清晰,使用方法,以MOOON-agent中的为例:
点击(此处)折叠或打开
- #define AGENT_MODULE_NAME "AGENT"
- #define AGENT_LOG_BIN(log, size) __MYLOG_BIN(agent::logger,log, size)
- #define AGENT_LOG_TRACE(format,...) __MYLOG_TRACE(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
- #define AGENT_LOG_FATAL(format,...) __MYLOG_FATAL(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
- #define AGENT_LOG_ERROR(format,...) __MYLOG_ERROR(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
- #define AGENT_LOG_WARN(format,...) __MYLOG_WARN(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
- #define AGENT_LOG_INFO(format,...) __MYLOG_INFO(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
- #define AGENT_LOG_DEBUG(format,...) __MYLOG_DEBUG(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
下面是完整的接口代码,具体实现,请参见logger.cpp:
点击(此处)折叠或打开
- #ifndef MOOON_SYS_LOG_H
- #define MOOON_SYS_LOG_H
- #include <sys/config.h>
- SYS_NAMESPACE_BEGIN
- /** 不要修改下面的常量值,而应当通过对应的方法去修改
- * 这些常量值主要是方便多模块共享,故放在这个公有头文件当中
- */
- enum
- {
- LOG_LINE_SIZE_MIN = 256,/** 日志行最小长度*/
- LOG_LINE_SIZE_MAX = 32768,/** 日志行最大长度(32K)*/
- 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* module_name,const char* format,...){}
- virtual void log_debug(const char* module_name,const char* format,...){}
- virtual void log_info(const char* module_name,const char* format,...){}
- virtual void log_warn(const char* module_name,const char* format,...){}
- virtual void log_error(const char* module_name,const char* format,...){}
- virtual void log_fatal(const char* module_name,const char* format,...){}
- virtual void log_state(const char* module_name,const char* format,...){}
- virtual void log_trace(const char* module_name,const char* format,...){}
- /** 写二进制日志*/
- virtual void bin_log(const char*log, uint16_t size){}
- };
- //////////////////////////////////////////////////////////////////////////
- // 日志宏,方便记录日志
- extern ILogger* g_logger;// 只是声明,不是定义,不能赋值哦!
- #define __MYLOG_DETAIL(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_detail())\
- logger->log_detail(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_DEBUG(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_debug())\
- logger->log_debug(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_INFO(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_info())\
- logger->log_info(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_WARN(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_warn())\
- logger->log_warn(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_ERROR(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_error())\
- logger->log_error(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_FATAL(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_fatal())\
- logger->log_fatal(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_STATE(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_state())\
- logger->log_state(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_TRACE(logger, module_name, format,...)\
- do { \
- if (NULL== logger)\
- printf(format, ##__VA_ARGS__);\
- else if(logger->enabled_trace())\
- logger->log_trace(module_name, format, ##__VA_ARGS__);\
- } while(false)
- #define __MYLOG_BIN(logger,log, size)\
- do { \
- if ((logger!= NULL) && logger->enabled_bin())\
- logger->bin_log(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__)
- SYS_NAMESPACE_END
- #endif // MOOON_SYS_LOG_H
- 改进后的日志类CLogger
- C++轻量级日志类CLogger的使用(更新)
- 改进后的FTPFactory
- 改进后的扫雷
- 写日志方法的改进
- 改进后的单词计数器
- 改进后的筛选函数
- 改进后的Sqlhelper组件
- 改进后的bubble sort
- rsync改进后的实现
- 改进后的多线程爬虫
- 改进后的mkw3site.vbs(创建虚拟目录)
- 改进后的多线程文件搜索
- 改进后的幻方程序
- 快速排序:改进后的冒泡排序
- 改进后的直接插入排序
- 改进后的跑马灯程序
- 改进后的希尔排序,速度快一倍
- 项目诉求
- 优雅的让一个类在线程安全和线程非安全间切换
- 简单的主备切换方案
- 怎么做自动化
- 来自mooon的最简单的日志类CSimpleLogger
- 改进后的日志类CLogger
- 开发理念和用户体验
- MOOON-server新消息处理接口
- 不再担心日志文件过大:通用日志滚动脚本
- Dash与Bash的语法区别
- PHP使用BC Math 函数处理浮点运算问题
- linux下获取进程网络链接状况(包括打开的侦听端口号)
- js点滴
- VB.NET中时间转换问题