zoukankan      html  css  js  c++  java
  • 改进后的日志类CLogger

    在原有的基础上增加了module_name,表示模块名,当一个系统由多模块组成时,输出的日志将更加清晰,使用方法,以MOOON-agent中的为例:

    点击(此处)折叠或打开

    1. #define AGENT_MODULE_NAME "AGENT"

    2. #define AGENT_LOG_BIN(log, size) __MYLOG_BIN(agent::logger, log, size)
    3. #define AGENT_LOG_TRACE(format, ...) __MYLOG_TRACE(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
    4. #define AGENT_LOG_FATAL(format, ...) __MYLOG_FATAL(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
    5. #define AGENT_LOG_ERROR(format, ...) __MYLOG_ERROR(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
    6. #define AGENT_LOG_WARN(format, ...) __MYLOG_WARN(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
    7. #define AGENT_LOG_INFO(format, ...) __MYLOG_INFO(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)
    8. #define AGENT_LOG_DEBUG(format, ...) __MYLOG_DEBUG(agent::logger, AGENT_MODULE_NAME, format, ##__VA_ARGS__)


    下面是完整的接口代码,具体实现,请参见logger.cpp:

    点击(此处)折叠或打开

    1. #ifndef MOOON_SYS_LOG_H
    2. #define MOOON_SYS_LOG_H
    3. #include <sys/config.h>
    4. SYS_NAMESPACE_BEGIN

    5. /** 不要修改下面的常量值,而应当通过对应的方法去修改
    6.   * 这些常量值主要是方便多模块共享,故放在这个公有头文件当中
    7.   */
    8. enum
    9. {
    10.     LOG_LINE_SIZE_MIN = 256, /** 日志行最小长度 */
    11.     LOG_LINE_SIZE_MAX = 32768, /** 日志行最大长度(32K) */
    12.     DEFAULT_LOG_FILE_SIZE = 104857600, /** 默认的单个日志文件大小(100MB) */
    13.     DEFAULT_LOG_FILE_BACKUP_NUMBER = 10 /** 默认的日志文件备份个数 */
    14. };

    15. /** 定义日志级别 */
    16. typedef enum
    17. {
    18.     LOG_LEVEL_DETAIL = 0,
    19.     LOG_LEVEL_DEBUG = 1,
    20.     LOG_LEVEL_INFO = 2,
    21.     LOG_LEVEL_WARN = 3,
    22.     LOG_LEVEL_ERROR = 4,
    23.     LOG_LEVEL_FATAL = 5,
    24.     LOG_LEVEL_STATE = 6, /** 仅输出状态数据 */
    25.     LOG_LEVEL_TRACE = 7
    26. }log_level_t;

    27. /** 通过日志级别名得到日志级别 */
    28. extern log_level_t get_log_level(const char* level_name);
    29. /** 通过日志级别得到日志级别名,如果传入错误的日志级别,则返回NULL */
    30. extern const char* get_log_level_name(log_level_t log_level);

    31. /**
    32.   * 日志器接口,提供常见的写日志功能
    33.   */
    34. class ILogger
    35. {
    36. public:
    37.     /** 空虚拟析构函数,以屏蔽编译器告警 */
    38.     virtual ~ILogger() {}
    39.         
    40.     /** 是否允许同时在标准输出上打印日志 */
    41.     virtual void enable_screen(bool enabled) {}
    42.     /** 是否允许二进制日志,二进制日志必须通过它来打开 */
    43.     virtual void enable_bin_log(bool enabled) {}
    44.     /** 是否允许跟踪日志,跟踪日志必须通过它来打开 */
    45.     virtual void enable_trace_log(bool enabled) {}
    46.     /** 是否自动在一行后添加结尾的点号,如果最后已经有点号或换符符,则不会再添加 */
    47.     virtual void enable_auto_adddot(bool enabled) {}
    48.     /** 是否自动添加换行符,如果已经有换行符,则不会再自动添加换行符 */
    49.     virtual void enable_auto_newline(bool enabled) {}
    50.     /** 设置日志级别,跟踪日志级别不能通过它来设置 */
    51.     virtual void set_log_level(log_level_t log_level) {}
    52.     /** 设置单个文件的最大建议大小 */
    53.     virtual void set_single_filesize(uint32_t filesize) {}
    54.     /** 设置日志文件备份个数,不包正在写的日志文件 */
    55.     virtual void set_backup_number(uint16_t backup_number) {}

    56.     /** 是否允许二进制日志 */
    57.     virtual bool enabled_bin() { return false; }
    58.     /** 是否允许Detail级别日志 */
    59.     virtual bool enabled_detail() { return false; }
    60.     /** 是否允许Debug级别日志 */
    61.     virtual bool enabled_debug() { return false; }
    62.     /** 是否允许Info级别日志 */
    63.     virtual bool enabled_info() { return false; }
    64.     /** 是否允许Warn级别日志 */
    65.     virtual bool enabled_warn() { return false; }
    66.     /** 是否允许Error级别日志 */
    67.     virtual bool enabled_error() { return false; }
    68.     /** 是否允许Fatal级别日志 */
    69.     virtual bool enabled_fatal() { return false; }
    70.     /** 是否允许输出状态日志 */
    71.     virtual bool enabled_state() { return false; }
    72.     /** 是否允许Trace级别日志 */
    73.     virtual bool enabled_trace() { return false; }

    74.     virtual void log_detail(const char* module_name, const char* format, ...) {}
    75.     virtual void log_debug(const char* module_name, const char* format, ...) {}
    76.     virtual void log_info(const char* module_name, const char* format, ...) {}
    77.     virtual void log_warn(const char* module_name, const char* format, ...) {}
    78.     virtual void log_error(const char* module_name, const char* format, ...) {}
    79.     virtual void log_fatal(const char* module_name, const char* format, ...) {}
    80.     virtual void log_state(const char* module_name, const char* format, ...) {}
    81.     virtual void log_trace(const char* module_name, const char* format, ...) {}

    82.     /** 写二进制日志 */
    83.     virtual void bin_log(const char* log, uint16_t size) {}
    84. };

    85. //////////////////////////////////////////////////////////////////////////
    86. // 日志宏,方便记录日志
    87. extern ILogger* g_logger; // 只是声明,不是定义,不能赋值哦!

    88. #define __MYLOG_DETAIL(logger, module_name, format, ...) \
    89. do { \
    90.     if (NULL == logger) \
    91.         printf(format, ##__VA_ARGS__); \
    92.     else if (logger->enabled_detail()) \
    93.         logger->log_detail(module_name, format, ##__VA_ARGS__); \
    94. } while(false)

    95. #define __MYLOG_DEBUG(logger, module_name, format, ...) \
    96. do { \
    97.     if (NULL == logger) \
    98.         printf(format, ##__VA_ARGS__); \
    99.     else if (logger->enabled_debug()) \
    100.         logger->log_debug(module_name, format, ##__VA_ARGS__); \
    101. } while(false)

    102. #define __MYLOG_INFO(logger, module_name, format, ...) \
    103. do { \
    104.     if (NULL == logger) \
    105.         printf(format, ##__VA_ARGS__); \
    106.     else if (logger->enabled_info()) \
    107.         logger->log_info(module_name, format, ##__VA_ARGS__); \
    108. } while(false)

    109. #define __MYLOG_WARN(logger, module_name, format, ...) \
    110. do { \
    111.     if (NULL == logger) \
    112.         printf(format, ##__VA_ARGS__); \
    113.     else if (logger->enabled_warn()) \
    114.         logger->log_warn(module_name, format, ##__VA_ARGS__); \
    115. } while(false)

    116. #define __MYLOG_ERROR(logger, module_name, format, ...) \
    117. do { \
    118.     if (NULL == logger) \
    119.         printf(format, ##__VA_ARGS__); \
    120.     else if (logger->enabled_error()) \
    121.         logger->log_error(module_name, format, ##__VA_ARGS__); \
    122. } while(false)

    123. #define __MYLOG_FATAL(logger, module_name, format, ...) \
    124. do { \
    125.     if (NULL == logger) \
    126.         printf(format, ##__VA_ARGS__); \
    127.     else if (logger->enabled_fatal()) \
    128.         logger->log_fatal(module_name, format, ##__VA_ARGS__); \
    129. } while(false)

    130. #define __MYLOG_STATE(logger, module_name, format, ...) \
    131. do { \
    132.     if (NULL == logger) \
    133.         printf(format, ##__VA_ARGS__); \
    134.     else if (logger->enabled_state()) \
    135.         logger->log_state(module_name, format, ##__VA_ARGS__); \
    136. } while(false)

    137. #define __MYLOG_TRACE(logger, module_name, format, ...) \
    138. do { \
    139.     if (NULL == logger) \
    140.         printf(format, ##__VA_ARGS__); \
    141.     else if (logger->enabled_trace()) \
    142.         logger->log_trace(module_name, format, ##__VA_ARGS__); \
    143. } while(false)

    144. #define __MYLOG_BIN(logger, log, size) \
    145. do { \
    146.     if ((logger != NULL) && logger->enabled_bin()) \
    147.         logger->bin_log(log, size); \
    148. } while(false)

    149. #define MYLOG_BIN(log, size) __MYLOG_BIN(sys::g_logger, log, size)
    150. #define MYLOG_TRACE(format, ...) __MYLOG_TRACE(sys::g_logger, NULL, format, ##__VA_ARGS__)
    151. #define MYLOG_STATE(format, ...) __MYLOG_STATE(sys::g_logger, NULL, format, ##__VA_ARGS__)
    152. #define MYLOG_FATAL(format, ...) __MYLOG_FATAL(sys::g_logger, NULL, format, ##__VA_ARGS__)
    153. #define MYLOG_ERROR(format, ...) __MYLOG_ERROR(sys::g_logger, NULL, format, ##__VA_ARGS__)
    154. #define MYLOG_WARN(format, ...) __MYLOG_WARN(sys::g_logger, NULL, format, ##__VA_ARGS__)
    155. #define MYLOG_INFO(format, ...) __MYLOG_INFO(sys::g_logger, NULL, format, ##__VA_ARGS__)
    156. #define MYLOG_DEBUG(format, ...) __MYLOG_DEBUG(sys::g_logger, NULL, format, ##__VA_ARGS__)
    157. #define MYLOG_DETAIL(format, ...) __MYLOG_DETAIL(sys::g_logger, NULL, format, ##__VA_ARGS__)

    158. SYS_NAMESPACE_END
    159. #endif // MOOON_SYS_LOG_H


  • 相关阅读:
    Sql诊断之Explain
    Cenos7安装docker环境以及docker-compose
    uniapp苹果内购获取不到苹果的iap支付通道
    iOS云打包如何设置通用链接等Capabilities配置
    iOS应用id,套装id,appid,BundleID申请教程
    利用Appuploader在window上申请IOS开发所需要的证书及描述文件
    浅析GET和POST请求的本质区别以及关于get请求的长度限制到底是多少的问题
    iOS苹果开发者组织账号申请时的坑
    apache开源项目--HIVE
    [Unit testing Java] Unit testing Junit Controller
  • 原文地址:https://www.cnblogs.com/aquester/p/9891773.html
Copyright © 2011-2022 走看看