改进后的日志类CLogger

在原有的基础上增加了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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王硕

原 Postgresql-XL安装部署

82816
来自专栏数据库新发现

字符集问题的初步探讨(五)

http://www.eygle.com/special/NLS_CHARACTER_SET_05.htm

1973
来自专栏Java架构解析

用SpringBoot集成Netty开发一个基于WebSocket的聊天室

基于SpringBoot,借助Netty控制长链接,使用WebSocket协议做一个实时的聊天室。

1.6K0
来自专栏乐沙弥的世界

ORA-02019 错误处理

       ORA-02019 错误提示是未找到远程数据库的连接说明,通常发生在本地数据库无法连接到远程数据库。引发该问题的原因很多,比如网络连接,连接方式(...

1061
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理

前言 回顾上一节,我们熟悉的了解了消息的请求和响应,这一节我们来建立数据库的表,表的设计蛮复杂 你也可以按自己所分析的情形结构来建表 必须非常熟悉表的结果...

39610
来自专栏杨建荣的学习笔记

session跟踪失效的问题和分析(57天)

最近碰到一个奇怪的问题,在生产和其他比较正式的环境中进行sql trace都没问题,但就是测试环境的数据库不知道怎么的, 设置sql_trace,开启诊断事件,...

36910
来自专栏别先生

一脸懵逼学习Hive的使用以及常用语法(Hive语法即Hql语法)

Hive官网(HQL)语法手册(英文版):https://cwiki.apache.org/confluence/display/Hive/LanguageMa...

1K9
来自专栏用户2442861的专栏

基于bootstrap的web登陆实例

前情提要 之前已经搭好的springMVC+myBatis项目骨架,详情请看–>传送门。

1.1K1
来自专栏微信公众号:Java团长

Spring boot Mybatis 整合

7.项目不使用application.properties文件 而使用更加简洁的application.yml文件: 将原有的resource文件夹下的app...

1712
来自专栏tiane12

DB2备份恢复流程

1171

扫码关注云+社区

领取腾讯云代金券