当前位置:   article > 正文

高效c/c++日志工具zlog使用介绍_c++ 使用zlog

c++ 使用zlog

1. zlog简介

zlog的资料网上很多,这里不在详细说明;zlog是用c写的一个日志工具,非常小,而且高效,可以同时向控制台和文件中输出,日志接口与printf使用基本一样,所以使用起来很简单。

感觉唯一的缺点是配置稍微复杂点,不能动态修改输出级别;

 

2.使用介绍

2.1 zlog编译

zlog的很好编译,如果你是在x86平台上,就不用修改makefile,进入src目录下直接make就可以了;
如果是在交叉编译,移植到嵌入式设备上用,那么只需要修改src/makefile里的cc为交叉编译器的gcc,
还有一处ar修改为交叉编译器的ar:

然后make,一般都可以直接编译过,编译结束后,在src目录下生成两个库文件:
libzlog.so和libzlog.a

2.2 zlog配置文件

zlog使用时,需要先配置一下输出规则,需要写在一个文件里;下面简单介绍一下配置文件。

  1. 配置文件*.conf
  2. 配置文件具体内容如下:
  3. [global]
  4. #改变量可以不写,默认是true,如果使用设置为true时,Zlog就会严格检查所用格式和规则,否则,忽略所用格式和规则。
  5. strict init = true
  6. buffer min = 1024
  7. buffer max = 2048
  8. #转档指定锁文件,用于保证多进程下日志安全转档,使用默认的配置文件为锁文件。
  9. #rotate lock file = zlog.lock
  10. #日志访问权限,600 只允许当前用户访问
  11. file perms = 600
  12. [formats]
  13. #使用默认日志输出格式 "%d %V [%p %F %L] %m%n" 输出日志格式为:%-5V按照日志级别按照左对齐
  14. #2012-12-13 10:23:29 INFO [31668:test_hello.c:41] hello, zlog
  15. simple = "%d.%-8.8us %-5V [%-8.8p.%-8.8t %F %L] %m%n"
  16. #simple = "%d.%ms %m%n"
  17. #simple2 = "%d.%us %m%n"
  18. [rules]
  19. #优先级从低到高 debug info notice warn fatal debug大于等于debug的优先级都能给通过debug输出。
  20. my_cat.* >stderr;
  21. #当hello.txt文件大小大于10MB时,会将hello.txt->hello.txt.0 0代表不删除任何文件
  22. my_cat.INFO "hello.txt",10kb * 3 ~ "hello.txt.#r";simple
  23. #my_cat.INFO "hello.txt",1MB ~ "hello-%d(%Y%m%d).#2s.txt";simple
  24. #my_cat.INFO "hello.txt",1MB;simple
  25. #my_cat.INFO "hello.txt",1MB;simple

2.3 zlog使用

zlog使用时首先要初始化配置,然后获取到一个句柄(指针),由于这个句柄是全局的,这在c中很正常,但是用c++久了,都不喜欢全局变量了,所以这里我用c++的单实例思想,把zlog初始化这部分封装了一下,这样用起来也简单,只需要把这两个文件包含进去,安照自己的需要,修改一下里面日志的路径和cat即可:

源文件log_manager.cpp:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/stat.h>
  6. #include <sys/types.h>
  7. #include <dirent.h>
  8. #include "log_manager.h"
  9. /*********************************************************/
  10. /*常量****************************************************/
  11. const char* ConfigText =
  12. "[global]\n"
  13. "strict init = true\n"
  14. "buffer min = 1024\n"
  15. "buffer max = 2048\n"
  16. "#日志访问权限,600 只允许当前用户访问\n"
  17. "file perms = 600\n"
  18. "[formats]\n"
  19. "simple = \"%d.%-8.8us %-5V [%-8.8p.%-8.8t %F %L] %m%n\"\n"
  20. "simple1= \"%m%n\"\n"
  21. "[rules]\n"
  22. "db_cat.warn >stderr;simple1\n"
  23. "db_cat.ERROR \"./logs/test.txt\",1M * 3 ~ \"./logs/test.txt.#r\";simple\n";
  24. //优先级从低到高 debug info notice warn error fatal debug大于等于debug的优先级都能给通过debug输出。
  25. /*********************************************************/
  26. static zlog_category_t * logHandler_m = NULL;
  27. static int DetectConfigFile(const char *File);
  28. /*****************************************************************************
  29. 函 数 名 : LogMgr.LogMgr
  30. 功能描述 : 日志模块初始化
  31. 输入参数 : 无
  32. 输出参数 : 无
  33. 返 回 值 :
  34. 修改历史 :
  35. 1.日 期 : 2012年12月19日 星期三
  36. 作 者 : fensjoy
  37. 修改内容 : 新生成函数
  38. *****************************************************************************/
  39. zlog_category_t * Init_zlog()
  40. {
  41. DetectConfigFile(LOG_CONFIG);
  42. zlog_init(LOG_CONFIG);
  43. logHandler_m = zlog_get_category(LOG_CAT);
  44. if (!logHandler_m)
  45. {
  46. printf("%s in Init_zlog, get cat fail! line = %d\n",PRO_NAME, __LINE__);
  47. zlog_fini();
  48. remove(LOG_CONFIG);
  49. exit(-1);
  50. }
  51. return logHandler_m;
  52. };
  53. /*****************************************************************************
  54. 函 数 名 : DetectConfigFile
  55. 功能描述 : 检测日志模块的配置文件是否存在,不存在则创建
  56. 输入参数 : const char *File
  57. 输出参数 : 无
  58. 返 回 值 : static
  59. 修改历史 :
  60. 1.日 期 : 2012年12月20日 星期四
  61. 作 者 : fensjoy
  62. 修改内容 : 新生成函数
  63. *****************************************************************************/
  64. static int DetectConfigFile(const char *File)
  65. {
  66. FILE *fp = NULL;
  67. int iRet = 0;
  68. DIR *log_p = NULL;
  69. char *cmd_buf = NULL;
  70. /*判断日志文件保存目录是否存在,不存在则创建*/
  71. log_p = opendir(LOG_PATH);
  72. if ( log_p == NULL )
  73. {
  74. printf("%s in DetectConfigFile, the log dir is not exist, now creat: %s!\n", PRO_NAME,LOG_PATH);
  75. cmd_buf = new char[64];
  76. printf("%s in DetectConfigFile, the log dir is not exist, now creat!\n", PRO_NAME);
  77. snprintf(cmd_buf, 64, "mkdir -p %s &", LOG_PATH);
  78. iRet = system(cmd_buf);
  79. delete [] cmd_buf;
  80. }
  81. else
  82. {
  83. closedir(log_p);
  84. }
  85. if ( access(File, F_OK) != 0 )
  86. {
  87. printf("%s log config file not exist,now creat!\n", PRO_NAME);
  88. fp = fopen(File, "w+");
  89. if(fp == NULL)
  90. {
  91. perror("#[db]: in DetectConfigFile, fopen config file error!");
  92. return -1;
  93. }
  94. iRet = fwrite(ConfigText, 1, strlen(ConfigText), fp);
  95. if ( iRet < 0 )
  96. {
  97. perror("#[para]: in DetectConfigFile, fwrite error!");
  98. fclose(fp);
  99. return -1;
  100. }
  101. fclose(fp);
  102. }
  103. return 0;
  104. }
  105. /*****************************************************************************
  106. 函 数 名 : getZlogHandler
  107. 功能描述 : 获取zlog日志句柄
  108. 输入参数 : 无
  109. 输出参数 : 无
  110. 返 回 值 : zlog_category_t
  111. 修改历史 :
  112. 1.日 期 : 2014年1月24日 星期五
  113. 作 者 : fensjoy
  114. 修改内容 : 新生成函数
  115. *****************************************************************************/
  116. zlog_category_t * getZlogHandler()
  117. {
  118. if ( NULL == logHandler_m )
  119. {
  120. logHandler_m = Init_zlog();
  121. }
  122. return logHandler_m;
  123. }

头文件log_manager.h

  1. /******************************************************************************
  2. 版权所有 (C), 2001-2014,
  3. ******************************************************************************
  4. 文 件 名 : log_manger.h
  5. 版 本 号 : 初稿
  6. 作 者 : fensjoy
  7. 生成日期 : 2013年6月5日 星期三
  8. 最近修改 :
  9. 功能描述 : log_manger.cpp 的头文件
  10. 函数列表 :
  11. 修改历史 :
  12. 1.日 期 : 2013年6月5日 星期三
  13. 作 者 : fensjoy
  14. 修改内容 : 创建文件
  15. ******************************************************************************/
  16. #ifndef __LOG_MANGER_H__
  17. #define ___LOG_MANGER_H__
  18. #include <iostream>
  19. #include "zlog.h"
  20. #define PRO_NAME "#[db]: "
  21. #define LOG_CONFIG "./test_log.conf"
  22. #define LOG_PATH "./"
  23. #define LOG_CAT "test_cat" //注意这里要与配置文件中保持一致,否则无法输出
  24. //extern zlog_category_t * logHandler_m;
  25. zlog_category_t * Init_zlog();
  26. zlog_category_t * getZlogHandler();
  27. #endif /* __LOG_MANGER_H__ */

测试main函数:

  1. #include <iostream>
  2. #include "log_manager.h"
  3. using namespace std;
  4. int main(int argc, char **argv)
  5. {
  6. zlog_category_t *pLog = Init_zlog();
  7. zlog_notice(pLog, "hello zlog!");
  8. zlog_error(pLog, "this msg both to console and log file!");
  9. zlog_debug(pLog, "this msg is debug level, just to console!");
  10. return 0;
  11. }

是不是很简单~;

make 编译后直接运行:

运行:log文件内容:

用起来确实很简单,我感觉zlog比较适合用于程序的性能分析,即程序长时间运行时,记录程序运行状态,然后分析程序性能,以便于后期优化;另外zlog有个地方需要注意下,就是在日志文件达到设置的大小时,切换日志文件,如果这时程序输出日志过多间隔也比较短(100毫秒)左右时,程序会挂掉,这时zlog的一个bug。一般程序输出日志没那么多时,不会出现

源代码已上传CSDN:

https://download.csdn.net/download/wuquan_1230/10931319

 

由于上传时下载积分最低选项是1,所以无法设置为0,如果没有积分可以微信公众号给我发消息,

我发你邮箱

 

微信订阅号:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/194881?site
推荐阅读
相关标签
  

闽ICP备14008679号