log.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. /************** Begin of Log.h *******************************************/
  2. /************************************************************************
  3. * Log.h
  4. *
  5. * edit by jesse in 2010-07-22
  6. * 日志相关代码的头文件
  7. ************************************************************************/
  8. #if !defined(LOG_H_INCLUDED_)
  9. #define LOG_H_INCLUDED_
  10. #if _MSC_VER > 1000
  11. #pragma once
  12. #endif // _MSC_VER > 1000
  13. #include <tchar.h>
  14. ///用户不需要使用日志,不要定义LOG_USELOG4CXX和LOG4C_ENABLE宏命令就可以了
  15. #if !defined(LOG_USELOG4CXX) && !defined(LOG4C_ENABLE)
  16. #define LOG4C(X)
  17. #define LOG4C_INIT()
  18. #define LOG4C_PARAM_CFG_FILE_NAME(strCfgFileName)
  19. #define LOG4C_PARAM_LOG_LEVEL(strLogLevel)
  20. #define LOG4C_PARAM_LOG_FILE_NAME(strLogFileName)
  21. #define LOG4C_PARAM_LOG_FILE_SIZE(iFileSize)
  22. #define LOG4C_PARAM_LOG_FILE_NUM(iFileNum)
  23. #define LOG4C_PARAM_REREAD_LOG_CFG_FILE(bReReadLogCfgFile)
  24. #define LOG4C_INIT_WITH_PARAM()
  25. #define LOG4C_INIT_WITH_PARAM_MULTI_PROCESS()
  26. #define LOG4C_FINI()
  27. #define LOG4C_INIT_DEFAULT()
  28. #define LOG4C_NO_FILENUM(X)
  29. #define LOG4C_NO_FILENUM_NO_LAYOUT(X)
  30. #define LOG4C_ORIGIN LOG4C_NO_FILENUM_NO_LAYOUT
  31. #define LOG4C_BLOCK_BEGIN(X)
  32. #define LOG4C_BLOCK_END(X)
  33. #define LOG4C_FUN(X)
  34. #define LOG4C_IF(X)
  35. #define LOG4C_LINE()
  36. #define LOG4C_HEX_DUMP(X)
  37. #define LOG4C_RETURN(X)
  38. #define LOG4C_RETURN_WITH_VALUE(X, reurnValue)
  39. #else // 宏定义
  40. #include <stdlib.h>
  41. /**日志记录模块初始化宏定义
  42. 注意事项: 必须初始化日志模块后才能正确记录日志
  43. 本初始化不要求应用程序所在目录有日志配置文件log4crc,会自动生成一个缺省的log4crc文件
  44. 使用例子: LOG4C_INIT_DEFAULT();
  45. 作者:Jesse 日期:2010-07-22
  46. */
  47. #define LOG4C_INIT_DEFAULT() log_init_with_string(_T(""), _T(""))
  48. /**日志记录模块初始化宏定义
  49. 注意事项: 必须初始化日志模块后才能正确记录日志
  50. 本初始化要求应用程序所在目录有日志配置文件log4crc才行
  51. 使用例子: LOG4C_INIT();
  52. 作者:Jesse 日期:2010-07-22
  53. */
  54. #define LOG4C_INIT() log_init()
  55. /************************************************************************
  56. 下面的为通过设置参数设置日志模块参数的宏定义(功能和LOG4C_INIT和LOG4C_INIT_DEFAULT类似):
  57. 1.必须先调用LOG_PARAM_XXXX系列宏定义设置参数,
  58. 1.1.如设置日志记录级别、生成日志文件名等。
  59. 1.2.若不LOG_PARAM_XXXX系列宏定义则将使用默认设置参数。
  60. 2.然后调用LOG_INIT_WITH_PARAM宏定义来初始化日志模块。
  61. 3.此时就可以记录日志了。
  62. */
  63. #define LOG4C_PARAM_CFG_FILE_NAME(strCfgFileName) log_set_log_cfg_file_name(strCfgFileName)
  64. #define LOG4C_PARAM_LOG_LEVEL(strLogLevel) log_set_log_level(strLogLevel)
  65. #define LOG4C_PARAM_LOG_FILE_NAME(strLogFileName) log_set_log_file_name(strLogFileName)
  66. #define LOG4C_PARAM_LOG_FILE_SIZE(iFileSize) log_set_log_file_size(iFileSize)
  67. #define LOG4C_PARAM_LOG_FILE_NUM(iFileNum) log_set_log_file_num(iFileNum)
  68. #define LOG4C_PARAM_REREAD_LOG_CFG_FILE(bReReadLogCfgFile) log_set_reread_log_cfg_file(bReReadLogCfgFile)
  69. #define LOG4C_INIT_WITH_PARAM() log_init_with_param()
  70. #define LOG4C_INIT_WITH_PARAM_MULTI_PROCESS() log_init_with_param_multi_process()
  71. /************************************************************************/
  72. /**日志记录模块结束宏定义
  73. 注意事项: 必须正确结束日志模块后才不会造成内存、资源泄漏
  74. 使用例子: LOG4C_FINI();
  75. 作者:Jesse 日期:2010-07-22
  76. */
  77. #define LOG4C_FINI() log_fini()
  78. ///进行LOG宏定义参数获取的结果
  79. typedef struct __LOG_PARAM
  80. {
  81. TCHAR strMsg[LOG4C_BUFFER_SIZE_DEFAULT];
  82. int iPriority;
  83. ///LOG4C_IF时的条件参数
  84. int iCondition;
  85. ///LOG4C_HEX_DUMP时的参数
  86. TCHAR *strHexBuf;
  87. int iHexBufLen;
  88. }LOG_PARAM;
  89. /*
  90. */
  91. #ifdef UNICODE
  92. #define LOG4C(X) \
  93. { \
  94. const LOG_PARAM log_param = log_vsprintf_wrapper X; \
  95. log_msg( __WFILE__, __LINE__, DEFAULT_LOG_CATEGORY_NAME, log_param.iPriority, log_param.strMsg ); \
  96. }
  97. #else
  98. #define LOG4C(X) \
  99. { \
  100. const LOG_PARAM log_param = log_vsprintf_wrapper X; \
  101. log_msg( __FILE__, __LINE__, DEFAULT_LOG_CATEGORY_NAME, log_param.iPriority, log_param.strMsg ); \
  102. }
  103. #endif
  104. #define LOG4C_NO_FILENUM(X) \
  105. { \
  106. const LOG_PARAM log_param = log_vsprintf_wrapper X; \
  107. log_msg_no_file_num( DEFAULT_LOG_CATEGORY_NAME, log_param.iPriority, log_param.strMsg ); \
  108. }
  109. #define LOG4C_NO_FILENUM_NO_LAYOUT(X) \
  110. { \
  111. const LOG_PARAM log_param = log_vsprintf_wrapper X; \
  112. log_msg_no_file_num_no_layout( DEFAULT_LOG_CATEGORY_NAME, log_param.iPriority, log_param.strMsg ); \
  113. }
  114. #define LOG4C_ORIGIN LOG4C_NO_FILENUM_NO_LAYOUT
  115. #ifdef UNICODE
  116. #define LOG4C_BLOCK_BEGIN(X) \
  117. { \
  118. const LOG_PARAM log_param = log_vsnprintf_wrapper_msg X; \
  119. log4c_block_begin(__WFILE__, __LINE__, log_param.strMsg); \
  120. }
  121. #else
  122. #define LOG4C_BLOCK_BEGIN(X) \
  123. { \
  124. const LOG_PARAM log_param = log_vsnprintf_wrapper_msg X; \
  125. log4c_block_begin(__FILE__, __LINE__, log_param.strMsg); \
  126. }
  127. #endif
  128. #ifdef UNICODE
  129. #define LOG4C_BLOCK_END(X) \
  130. { \
  131. const LOG_PARAM log_param = log_vsnprintf_wrapper_msg X; \
  132. log4c_block_end(__WFILE__, __LINE__, log_param.strMsg); \
  133. }
  134. #else
  135. #define LOG4C_BLOCK_END(X) \
  136. { \
  137. const LOG_PARAM log_param = log_vsnprintf_wrapper_msg X; \
  138. log4c_block_end(__FILE__, __LINE__, log_param.strMsg); \
  139. }
  140. #endif
  141. #ifdef UNICODE
  142. #define LOG4C_FUN(X) \
  143. { \
  144. const LOG_PARAM log_param = log_vsnprintf_wrapper_msg X; \
  145. log_msg_func(__WFILE__, __WFUNCTION__, __LINE__, DEFAULT_LOG_CATEGORY_NAME, LOG4C_PRIORITY_TRACE, log_param.strMsg ); \
  146. }
  147. #else
  148. #define LOG4C_FUN(X) \
  149. { \
  150. const LOG_PARAM log_param = log_vsnprintf_wrapper_msg X; \
  151. log_msg_func(__FILE__, __FUNCTION__, __LINE__, DEFAULT_LOG_CATEGORY_NAME, LOG4C_PRIORITY_TRACE, log_param.strMsg ); \
  152. }
  153. #endif
  154. /** Output trace on condition.
  155. This macro outputs a trace of any information needed, using standard stream
  156. output operators. The output is only made if the conditional is TRUE.
  157. example: LOG4C_IF((4>3, LOG4C_PRIORITY_TRACE, "HELLO"));
  158. */
  159. #ifdef UNICODE
  160. #define LOG4C_IF(X) \
  161. { \
  162. const LOG_PARAM log_param = log_condition_vsnprintf_wrapper X; \
  163. if( log_param.iCondition ) {\
  164. log_msg( \
  165. __WFILE__, \
  166. __LINE__, \
  167. DEFAULT_LOG_CATEGORY_NAME, \
  168. log_param.iPriority, \
  169. log_param.strMsg\
  170. ); \
  171. }\
  172. }
  173. #else
  174. #define LOG4C_IF(X) \
  175. { \
  176. const LOG_PARAM log_param = log_condition_vsnprintf_wrapper X; \
  177. if( log_param.iCondition ) {\
  178. log_msg( \
  179. __FILE__, \
  180. __LINE__, \
  181. DEFAULT_LOG_CATEGORY_NAME, \
  182. log_param.iPriority, \
  183. log_param.strMsg\
  184. ); \
  185. }\
  186. }
  187. #endif
  188. /** Trace the execution of a line.
  189. This macro outputs a trace of a source file line execution.
  190. */
  191. #ifdef UNICODE
  192. #define LOG4C_LINE() \
  193. { \
  194. TCHAR strBuffer[128] = {0}; \
  195. _sntprintf(strBuffer, sizeof(strBuffer), _T("line:%d"), __LINE__); \
  196. log_msg( \
  197. __WFILE__, \
  198. __LINE__, \
  199. DEFAULT_LOG_CATEGORY_NAME, \
  200. LOG4C_PRIORITY_TRACE, \
  201. strBuffer \
  202. ); \
  203. }
  204. #else
  205. #define LOG4C_LINE() \
  206. { \
  207. TCHAR strBuffer[128] = {0}; \
  208. _sntprintf(strBuffer, sizeof(strBuffer), _T("line:%d"), __LINE__); \
  209. log_msg( \
  210. __FILE__, \
  211. __LINE__, \
  212. DEFAULT_LOG_CATEGORY_NAME, \
  213. LOG4C_PRIORITY_TRACE, \
  214. strBuffer \
  215. ); \
  216. }
  217. #endif
  218. /**将内存中数据以十六进制方式打印出来的一个宏定义
  219. example:LOG4C_HEX_DUMP((LOG4C_PRIORITY_TRACE, strHexBuf, iHexBufLen));
  220. 作者:Jesse 日期:2010-07-22
  221. */
  222. #define LOG4C_HEX_DUMP(X) \
  223. { \
  224. log_hex_dump_vsnprintf_wrapper X; \
  225. }
  226. /** 输出文件名和行号的日志输出宏,记录完日志直接return
  227. 然后再输入到LOG宏定义中
  228. 作者:Jesse 日期:2010-07-22
  229. */
  230. #define LOG4C_RETURN(X) \
  231. { \
  232. LOG4C(X); \
  233. return; \
  234. }
  235. /** 输出文件名和行号的日志输出宏,记录完日志直接return returnValue;
  236. 然后再输入到LOG宏定义中
  237. example:LOG4C_RETURN_WITH_VALUE(( LOG4C_PRIORITY_TRACE, "message%d", 1), returnValue);
  238. 作者:Jesse 日期:2010-07-22
  239. */
  240. #define LOG4C_RETURN_WITH_VALUE(X, returnValue) \
  241. { \
  242. LOG4C(X); \
  243. return returnValue; \
  244. }
  245. #endif ///!defined(LOG_USELOG4CXX) && !defined(LOG4C_ENABLE)
  246. #if ((defined(LOG_USELOG4CXX) && defined(__cplusplus)) || defined(LOG4C_ENABLE))
  247. #ifdef _WIN32
  248. ///log4c正确使用必须的一些宏定义
  249. #define snprintf _snprintf
  250. #ifndef HAVE_CONFIG_H
  251. #define HAVE_CONFIG_H
  252. #endif
  253. ///#define LOG4C_EXPORTS
  254. #endif
  255. ///定义linux下使用到而不存在的类型
  256. #ifdef linux
  257. ///typedef int BOOL;
  258. #ifndef BOOL
  259. #define BOOL int
  260. #define FALSE 0
  261. #define TRUE 1
  262. #endif
  263. #define sprintf_s snprintf
  264. ///#define strcpy_s strncpy
  265. #endif
  266. /// 日志输出缺省category
  267. #ifndef DEFAULT_LOG_CATEGORY_NAME
  268. #define DEFAULT_LOG_CATEGORY_NAME _T("root")
  269. #endif
  270. /** 日志记录级别
  271. */
  272. /** fatal */ #define LOG_FATAL LOG4C_PRIORITY_FATAL
  273. /** alert */ #define LOG_ALERT LOG4C_PRIORITY_ALERT
  274. /** crit */ #define LOG_CRIT LOG4C_PRIORITY_CRIT
  275. /** error */ #define LOG_ERROR LOG4C_PRIORITY_ERROR
  276. /** warn */ #define LOG_WARN LOG4C_PRIORITY_WARN
  277. /** notice */ #define LOG_NOTICE LOG4C_PRIORITY_NOTICE
  278. /** info */ #define LOG_INFO LOG4C_PRIORITY_INFO
  279. /** debug */ #define LOG_DEBUG LOG4C_PRIORITY_DEBUG
  280. /** trace */ #define LOG_TRACE LOG4C_PRIORITY_TRACE
  281. /** notset */ #define LOG_NOTSET LOG4C_PRIORITY_NOTSET
  282. /** unknown */ #define LOG_UNKNOWN LOG4C_PRIORITY_UNKNOWN
  283. #include "log4c/defs.h"
  284. __LOG4C_BEGIN_DECLS
  285. /** 日志模块初始化
  286. @return int:return 0 for success
  287. 作者:Jesse 日期:2010-07-22
  288. */
  289. LOG4C_API int log_init();
  290. /** 日志模块初始化,指定配置文件名称
  291. @return int:return 0 for success
  292. 作者:Jesse 日期:2010-07-22
  293. */
  294. LOG4C_API int log_init_with_cfg_file(const TCHAR *strCfgFileName);
  295. /** 日志模块清理
  296. @return int:return 0 for success
  297. 作者:Jesse 日期:2010-07-22
  298. */
  299. LOG4C_API int log_fini();
  300. /**宏参数抽取priority函数
  301. 本函数接受LOG_DEBUG(X)的参数,并从该宏定义的参数中返回priority的值
  302. @return const int : iPriority.
  303. 作者:Jesse 日期:2010-07-22
  304. */
  305. LOG4C_API const int log_get_priority_wrapper(
  306. const int iPriority, ///日志记录级别
  307. const TCHAR* strFormat, ///日志内容格式
  308. ... ///日志内容
  309. );
  310. /**
  311. 将大小为count的缓冲区中内容按字节以16进制字符串打印出来,
  312. 返回值即为指向相应的字符串,
  313. 该返回指向的存储区域要调用本函数的用户显示的进行删除
  314. */
  315. LOG4C_API void log4c_sprintf_data(TCHAR *buff, int count, TCHAR *dest_buffer);
  316. /**日志记录宏定义
  317. 注意事项: 使用时参数必须使用两个括号括起来,LOG4C((X));见下面例子
  318. 使用例子: LOG4C((LOG_ERROR, "Hello World! My Name is %s, and my age is %d ", "Jess", "28" ));
  319. 作者:Jesse 日期:2010-07-22
  320. */
  321. LOG4C_API const LOG_PARAM log_vsprintf_wrapper(
  322. const int iPriority, ///日志记录级别
  323. const TCHAR* strFormat, ///日志内容格式
  324. ... ///日志内容
  325. );
  326. LOG4C_API const LOG_PARAM log_condition_vsnprintf_wrapper(
  327. const int iCondition, ///条件
  328. const int iPriority, ///日志记录级别
  329. const TCHAR* strFormat, ///日志内容格式
  330. ... ///日志内容
  331. );
  332. LOG4C_API void log_hex_dump_vsnprintf_wrapper(
  333. const int iPriority, ///日志记录级别
  334. const TCHAR* strHexBuf, ///缓冲区首地址
  335. const int iHexBufLen, ///缓冲区长度
  336. ... ///日志内容
  337. );
  338. LOG4C_API const LOG_PARAM log_vsnprintf_wrapper_msg(
  339. const TCHAR* strFormat, ///日志内容格式
  340. ... ///日志内容
  341. );
  342. /** 日志记录
  343. 日志记录为一个字符串指针指向的内容
  344. @return void
  345. 作者:Jesse 日期:2010-07-22
  346. */
  347. LOG4C_API void log_msg(
  348. const TCHAR *strFile, ///文件名
  349. const int iLineNum, ///行号
  350. const TCHAR *strCatName, ///category名
  351. const int iPriority, ///日志记录级别
  352. const TCHAR *strFormat, ///日志内容格式
  353. ... ///日志内容
  354. );
  355. LOG4C_API void log_msg_func(
  356. const TCHAR *strFile, ///文件名
  357. const TCHAR *strFuncName,///函数名
  358. const int iLineNum, ///行号
  359. const TCHAR *strCatName, ///category名
  360. const int iPriority, ///日志记录级别
  361. const TCHAR *strFormat, ///日志内容格式
  362. ... ///日志内容
  363. );
  364. /** 日志记录,不记录文件名和行号
  365. 日志记录为一个字符串指针指向的内容
  366. @return void
  367. 作者:Jesse 日期:2010-07-22
  368. */
  369. LOG4C_API void log_msg_no_file_num(
  370. const TCHAR *strCatName, ///category名
  371. const int iPriority, ///日志记录级别
  372. const TCHAR *strFormat, ///日志内容格式
  373. ... ///日志内容
  374. );
  375. /** 日志记录,不记录文件名和行号,没有任何layout转换,直接输出相应的字符文本到日志中
  376. 此条记录没有行号,也没有线程号,也没有回车等
  377. 日志记录为一个字符串指针指向的内容
  378. @return void
  379. 作者:Jesse 日期:2010-07-22
  380. */
  381. LOG4C_API void log_msg_no_file_num_no_layout(
  382. const TCHAR *strCatName, ///category名
  383. const int iPriority, ///日志记录级别
  384. const TCHAR *strFormat, ///日志内容格式
  385. ... ///日志内容
  386. );
  387. /** 日志模块初始化
  388. 以日志配置文件字符串内容和日志配置文件命作为参数
  389. 若相应配置文件存在则使用,否则按照给定内容和文件名创建日志配置文件并使用之
  390. @return int,0 表成功
  391. 作者:Jesse 日期:2010-07-22
  392. */
  393. LOG4C_API int log_init_with_string(
  394. const TCHAR *strFileContent,
  395. const TCHAR *strFileName
  396. );
  397. /** 日志模块初始化
  398. 以日志配置文件命作为参数
  399. @return int,0 表成功
  400. 作者:Jesse 日期:2010-07-22
  401. */
  402. LOG4C_API int log_init_with_cfg_file_wrapper(
  403. const TCHAR * strConfigFile
  404. );
  405. /** 日志模块初始化-日志配置文件的文件名设置
  406. 以日志配置文件命作为参数
  407. @return void
  408. 作者:Jesse 日期:2010-07-22
  409. */
  410. LOG4C_API void log_set_log_cfg_file_name(const TCHAR *strFileName);
  411. /** 日志模块初始化-生成的日志文件的文件名设置
  412. 以日志文件命作为参数
  413. @return void
  414. 作者:Jesse 日期:2010-07-22
  415. */
  416. LOG4C_API void log_set_log_file_name(const TCHAR *strFileName);
  417. /** 日志模块初始化-日志记录级别设置
  418. @return void
  419. 作者:Jesse 日期:2010-07-22
  420. */
  421. LOG4C_API void log_set_log_level(const TCHAR *strLogLevel);
  422. /** 日志模块初始化-日志记录文件的大设置
  423. @return void
  424. 作者:Jesse 日期:2010-07-22
  425. */
  426. LOG4C_API void log_set_log_file_size(const int iFileSize);
  427. /** 日志模块初始化-日志记录文件的个数设置
  428. 记录到最大个数后将回滚重复覆盖第一个日志文件,依次类推
  429. @return void
  430. 作者:Jesse 日期:2010-07-22
  431. */
  432. LOG4C_API void log_set_log_file_num(const int iFileNum);
  433. /** 日志模块初始化-是否实时读取日志配置文件
  434. 设置是否每次记录时都读取日志配置文件
  435. @param:const BOOL m_bReReadLogCfgFile
  436. @return void
  437. 作者:Jesse 日期:2010-07-22
  438. */
  439. LOG4C_API void log_set_reread_log_cfg_file(const BOOL bReReadLogCfgFile);
  440. /** 日志模块初始化-带参数进行日志模块初始化
  441. 这里的参数则为上面的几个API设置的参数,
  442. 所以本函数一定要在日志配置参数设置好之后调用设置的参数才能生效的
  443. @return int,OK,成功;FAILURE,失败
  444. 作者:Jesse 日期:2010-07-22
  445. */
  446. LOG4C_API int log_init_with_param();
  447. /** 日志模块初始化-带参数进行日志模块初始化,程序的多个运行实例产生的日志不互相冲突
  448. 这里的参数则为上面的几个API设置的参数,
  449. 所以本函数一定要在日志配置参数设置好之后调用设置的参数才能生效的
  450. @return int,OK,成功;FAILURE,失败
  451. 作者:Jesse 日期:2010-07-22
  452. */
  453. LOG4C_API int log_init_with_param_multi_process();
  454. /** 日志记录Block方式能清楚的表明调用层次
  455. 类似下面这种B-Entry类型日志:
  456. main.cpp(87) B-Entry ==> main
  457. main.cpp(90) B-Entry ====> main_01
  458. main.cpp(92) B-Entry ======> main_02
  459. main.cpp(92) B-Exit <====== main_02
  460. main.cpp(90) B-Exit <==== main_01
  461. @return void
  462. 作者:Jesse 日期:2010-07-22
  463. */
  464. LOG4C_API void log4c_block_begin(const TCHAR * fileName, int lineNum, const TCHAR * traceName);
  465. /** 日志记录Block方式能清楚的表明调用层次
  466. 类似下面这种B-Exit类型日志:
  467. main.cpp(87) B-Entry ==> main
  468. main.cpp(90) B-Entry ====> main_01
  469. main.cpp(92) B-Entry ======> main_02
  470. main.cpp(92) B-Exit <====== main_02
  471. main.cpp(90) B-Exit <==== main_01
  472. @return void
  473. 作者:Jesse 日期:2010-07-22
  474. */
  475. LOG4C_API void log4c_block_end(const TCHAR * fileName, int lineNum, const TCHAR * traceName);
  476. /**检测配置文件是否存在
  477. @return const int : iPriority.
  478. 作者:Jesse 日期:2010-07-22
  479. */
  480. extern const int log_check(void);
  481. /**检测配置文件是否存在,只检测传入的配置文件名
  482. @return const int : iPriority.
  483. 作者:Jesse 日期:2010-07-22
  484. */
  485. extern const int log_check_with_cfg_file(const TCHAR *strCfgFileName);
  486. /**宏参数抽取format函数
  487. 本函数接受LOG_DEBUG(X)的参数,并从该宏定义的参数中返回format的值
  488. @return const char* : strFormat
  489. 作者:Jesse 日期:2010-07-22
  490. */
  491. extern const TCHAR* log_get_format_wrapper(
  492. const int iPriority, ///日志记录级别
  493. const TCHAR* strFormat, ///日志内容格式
  494. ... ///日志内容
  495. );
  496. /** 设置appender
  497. @return int:
  498. 作者:Jesse 日期:2010-07-22
  499. */
  500. extern int log_setappender(
  501. const TCHAR *strCatName, ///category名
  502. const TCHAR *strAppenderName ///appender名
  503. );
  504. /** 日志记录
  505. 支持类似printf函数的带格式输出
  506. @return void
  507. 作者:Jesse 日期:2010-07-22
  508. */
  509. extern void log_log(
  510. const TCHAR *strCatName, ///category名
  511. const int iPriority, ///日志记录级别
  512. const TCHAR *strFormat, ///日志内容格式
  513. ... ///日志内容
  514. );
  515. /** 日志模块初始化-日志模块使用实例个数自增
  516. @return void
  517. 作者:Jesse 日期:2010-07-22
  518. */
  519. extern void IncreaseLogModuleUsage();
  520. __LOG4C_END_DECLS
  521. ///#include "log4c.h"
  522. #endif ///((defined(LOG_USELOG4CXX) && defined(__cplusplus)) || defined(LOG4C_ENABLE))
  523. #endif // !defined(LOG_H_INCLUDED_)
  524. /************** End of Log.h *******************************************/