log4rvcother.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #ifndef _VTM_LOG4RVCOTHER_H_
  2. #define _VTM_LOG4RVCOTHER_H_
  3. #pragma once
  4. #include <sstream>
  5. #include <string>
  6. #include <cstring>
  7. #ifdef _WIN32
  8. #ifdef LIBLOG4RVCOTHER_EXPORTS
  9. #define LOG4RVCOTHER_API __declspec(dllexport)
  10. #else
  11. #define LOG4RVCOTHER_API __declspec(dllimport)
  12. #endif
  13. #else
  14. #if ( defined(__GNUC__) && __GNUC__ >= 4 )
  15. #define LOG4RVCOTHER_API __attribute__((visibility("default")))
  16. #else
  17. #define LOG4RVCOTHER_API
  18. #endif
  19. #endif
  20. #ifdef UNICODE
  21. #error This version is not support {UNICODE} char set!!
  22. #define LOG4VTM_TEXT2(STRING) L##STRING
  23. typedef std::wstring vtm_string;
  24. typedef wchar_t vtm_char;
  25. #else
  26. #define LOG4VTM_TEXT2(STRING) STRING
  27. typedef std::string vtm_string;
  28. typedef char vtm_char;
  29. #endif // UNICODE
  30. #define LOG4VTM_TEXT(STRING) LOG4VTM_TEXT2(STRING)
  31. #ifndef RVC_VENDOE_BUILDIN_TYPE
  32. #if (defined(_WIN32) || defined(_WIN64))
  33. typedef unsigned char BYTE;
  34. typedef unsigned short WORD;
  35. typedef unsigned long DWORD;
  36. typedef unsigned long* PDWORD;
  37. #else
  38. typedef uint8_t BYTE;
  39. typedef uint8_t* LPBYTE;
  40. typedef uint16_t WORD;
  41. typedef uint32_t DWORD;
  42. typedef uint32_t* PDWORD;
  43. typedef char CHAR;
  44. #endif
  45. #define RVC_VENDOE_BUILDIN_TYPE
  46. #endif // !RVC_VENDOE_BUILDIN_TYPE
  47. #if defined(_MSC_VER)
  48. #define LOG4VTM_START_DOWHILE_WARNING() \
  49. __pragma (warning (push)) \
  50. __pragma (warning (disable:4127))
  51. #define LOG4VTM_END_DOWHILE_WARNING() \
  52. __pragma (warning (pop))
  53. #else
  54. #define LOG4VTM_START_DOWHILE_WARNING()
  55. #define LOG4VTM_END_DOWHILE_WARNING()
  56. #endif
  57. #define CMB_LOG_TYPE_CONSOLE 1 /*控制台输出*/
  58. #define CMB_LOG_TYPE_FILE 2 /*文件记录输出*/
  59. #define CMB_LOG_TYPE_SOCKET 4 /*TCP传输输出,暂未实现*/
  60. #define CMB_LOG_LEVEL_OFF 6 /*关闭任何日志输出*/
  61. #define CMB_LOG_LEVEL_FATAL 5 /*非常严重类型的日志输出*/
  62. #define CMB_LOG_LEVEL_ERROR 4 /*错误类型的日志输出*/
  63. #define CMB_LOG_LEVEL_WARN 3 /*告警类型的日志输出*/
  64. #define CMB_LOG_LEVEL_INFO 2 /*普通日志输出*/
  65. #define CMB_LOG_LEVEL_DEBUG 1 /*调试日志输出*/
  66. #define CMB_LOG_LEVEL_TRACE 0 /*跟踪函数进出等输出*/
  67. #define CMB_LOG_LEVEL_ALL CMB_LOG_LEVEL_TRACE
  68. #define CMB_LOG_TRACE 1
  69. #define CMB_LOG_DEBUG 2
  70. #define CMB_LOG_INFO 3
  71. #define CMB_LOG_WARN 4
  72. #define CMB_LOG_ERROR 5
  73. #define CMB_LOG_FATAL 6
  74. //#define CMB_LOG_ASSERT 7
  75. #define CMB_INSTANTIATE_OSTRINGSTREAM(var) \
  76. std::basic_ostringstream<char>& var \
  77. = cmb::log4rvcother::get_oss()
  78. #define CMB_LOG_BODY(logLevel, logEvent) \
  79. LOG4VTM_START_DOWHILE_WARNING() \
  80. do { \
  81. cmb::log4rvcother* _l \
  82. = cmb::log4rvcother::instance(); \
  83. CMB_INSTANTIATE_OSTRINGSTREAM (_log4cplus_buf); \
  84. _log4cplus_buf << logEvent; \
  85. _l->log(logLevel, _log4cplus_buf.str()); \
  86. } while (0) \
  87. LOG4VTM_END_DOWHILE_WARNING()
  88. /*!
  89. * @brief 打印日志的函数,所有等级的日志打印均通过该宏调用实现
  90. * @param[in]
  91. * severity: 日志等级 TRACE, INFO, WARN, ERROR, FATAL, ASSERT
  92. * ostr: 要打印的内容,支持 << 连续输出
  93. */
  94. #define LOG4VTM(severity, ostr) \
  95. CMB_LOG_BODY(CMB_LOG_ ## severity, ostr)
  96. /*!
  97. * @brief: 用于记录函数进出的宏定义,在进入目的函数时立即调用,在该函数退出时会打印日志
  98. /**/
  99. #define LOG4VTM_FUNCTION() cmb::log4vendor_tracer _FunctionTraceLogger(\
  100. __FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__)
  101. /*!
  102. * @brief 类似于 LOG4VTM_FUNCTION(),除外还添加一个入参用于打印返回值,注意该入参的生命周期为整个函数内!!
  103. * @param[in]: pValue - 仅支持传入 int* 或 DWORD* 类型,在日志中会打印指针所存储的值
  104. */
  105. #define TRACE4VTM_FUNCTION(pValue) cmb::log4vendor_tracer _FunctionTraceLogger(\
  106. __FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__, (pValue))
  107. #define RVCOTHER_BUFF_SIZE 256
  108. namespace cmb
  109. {
  110. struct log_init_config_c
  111. {
  112. short log_type; /*见上面 CMB_LOG_TYPE_FILE 等定义*/
  113. short log_level; /*见上面 CMB_LOG_TRACE 等定义*/
  114. char dev_name[RVCOTHER_BUFF_SIZE]; /*硬件名称,用于作为子目录的区分*/
  115. char log_dir[RVCOTHER_BUFF_SIZE]; /*在 log_type 包含 CMB_LOG_TYPE_FILE 时,该参数才有效,用于记录日志的目录*/
  116. };
  117. struct LOG4RVCOTHER_API log_init_config
  118. {
  119. short log_type; /*见上面 CMB_LOG_TYPE_FILE 等定义*/
  120. short log_level; /*见上面 CMB_LOG_TRACE 等定义*/
  121. std::string dev_name; /*硬件名称,用于作为子目录的区分*/
  122. std::string log_dir; /*在 log_type 包含 CMB_LOG_TYPE_FILE 时,该参数才有效,用于记录日志的目录*/
  123. std::string terminalno; /*创建log时必须,由healthmanager传入*/
  124. log_init_config()
  125. :log_type(CMB_LOG_TYPE_FILE)
  126. , log_level(CMB_LOG_TRACE)
  127. , dev_name(LOG4VTM_TEXT("VTM")), log_dir(LOG4VTM_TEXT(""))
  128. {
  129. }
  130. log_init_config(const log_init_config& rhs)
  131. :log_type(rhs.log_type)
  132. , log_level(rhs.log_level)
  133. , dev_name(rhs.dev_name), log_dir(rhs.log_dir)
  134. {
  135. }
  136. };
  137. class LOG4RVCOTHER_API log4rvcother
  138. {
  139. public:
  140. static log4rvcother* instance();
  141. /*!
  142. * @brief 在调用打印日志的相关宏时,请先调用此函数进行初始化,否则将不会打印任何形式的日志内容
  143. *
  144. * @param[in]
  145. * config: 日志初始化的配置参数
  146. * ret_msg: 防止传入的参数有误,在必要的时候记录错误信息,供上层打印排查
  147. *
  148. * 如传入的参数依次为:"PinPad", CMB_LOG_TYPE_FILE|CMB_LOG_TYPE_CONSOLE, "C:\\rvc\\dbg"
  149. * 那么将会日志记在 "C:\\rvc\\dbg\\PinPad\\{YYYYMMDD}.log" 内,并将支持控制台输出
  150. *
  151. */
  152. static void init(const log_init_config& config, vtm_string& ret_msg);
  153. static void initp(const log_init_config_c* pconfig, char pret_msg[RVCOTHER_BUFF_SIZE]);
  154. virtual void log(int log_level, const vtm_string& text) = 0;
  155. static std::basic_ostringstream<char>& get_oss();
  156. //static std::basic_ostringstream<wchar_t>& get_woss();
  157. #ifdef LIBLOG4RVCOTHER_EXPORTS
  158. public:
  159. #else
  160. private:
  161. #endif
  162. log4rvcother() {}
  163. virtual ~log4rvcother() {}
  164. private:
  165. log4rvcother(const log4rvcother& rhs);
  166. };
  167. //////////////////////////////////////////////////////////////////////////
  168. class LOG4RVCOTHER_API log4vendor_tracer
  169. {
  170. public:
  171. log4vendor_tracer(const char* message, const char* fileName, int nLine);
  172. log4vendor_tracer(const char* message, const char* fileName, int nLine, int* pRet);
  173. log4vendor_tracer(const char* message, const char* fileName, int nLine, PDWORD pRet);
  174. ~log4vendor_tracer();
  175. static const char* _get_file_name(const char* file_path);
  176. private:
  177. log4vendor_tracer(log4vendor_tracer const&);
  178. log4vendor_tracer& operator = (log4vendor_tracer const&);
  179. const char* m_pszMes;
  180. const char* m_pszFileN;
  181. int m_nLine;
  182. int* m_pnRet;
  183. PDWORD m_pDwRet;
  184. int* m_pfRet;
  185. int m_retType;
  186. };
  187. }
  188. #endif //_VTM_LOG4RVCOTHER_H_