yaolog v1.6 跨平台日志库 (C++)

       

        写代码总免不了要看日志。就C++而言,不少程序员只是简单地用printf来输出日志,或者临时写个日志类,log4cpp等比较“重型”的日志库的使用率反而并不怎么高(至少从我经历的项目而言)。也许是不想为不需要的功能付出额外的学习成本,但无论如何,对于通用类别的工具采取临时手写的方式来应付,从长远考虑,在功能性和健壮性方面是得不偿失的。写这个日志类(yaolog)的最初的想法只是为了实现“输出到文件的带有时间信息的printf”,后来历经不同项目需求的“拷问”,借鉴和引用了很多开源代码(在此对那些作者表示感谢),就成了现在这个样子。yaolog的主要特点如下:

        # printf风格的接口,包括LOGA__, LOGW__, LOG__, LOGBIN__, LOGBIN_F__
        # 日志附加信息包括时间,源代码文件,函数,行号
        # 每个日志对象都有单独的行为
        # 在程序运行时通过配置ini文件动态改变日志行为
        # 可以输出到控制台窗口,文件,http服务器
        # 线程安全
        # 跨平台(windows, linux)

        

v1.6新加功能:
1 可以输出格式化的二进制日志(见上图),非常方便对socket通信之类进行debug
2 可以设置每天自动生成新的日志文件


        这里有一个重点就是尽可能的简单,我对接口修改过多次,为了尽量做到简单易用和自解释。而上述功能都是从实际项目的需求中提炼出来的,比如为什么每个日志对象需要有单独的行为?看日志文件最大的烦恼就是内容太多太杂不容易找到需要的,那么yaolog给出一种解决方法是设置不同的日志对象,如果想专门查看socket日志,可以只启用socket日志对象,或者将socket日志专门输出到一个文件,而这些都是可以在程序运行时动态配置的。又比如发送日志到http服务器,起因于某次有个用户在QQ上报了一个bug,这个bug如果在有日志的debug版本下应该能很快确定原因,但是release版本是没有日志的。当然,也可以给用户一个带日志的dll去替换,但是这种方法至少存在两个问题:版本控制(新的dll和用户原来的dll一致吗)和日志查看(用户怎样将日志提交给开发人员,不要高估了小白)。于是就想到要在服务器端控制日志的启用,以及将日志内容发送到服务器进行分析。

         yaolog v1.6的代码和demo在这里

        另外我在codeproject上发了一篇详细说明,地址在这里

        如果你觉得这个工具好用请回帖支持一下。有什么问题或建议可以留言讨论。


        下面贴一段简单的测试代码:

[cpp]  view plain   copy
  1. #include <iostream>  
  2. #include "yaolog.h"  
  3.   
  4.   
  5. // 日志对象的ID,可以自定义,不能雷同  
  6. #define LOGID_I "info"  
  7. #define LOGID_B "bin"  
  8. #define LOGID_FB "formatted_bin"  
  9.   
  10.   
  11. int main()  
  12. {  
  13.     // 初始化,在程序入口点调用  
  14.     YAOLOG_INIT;  
  15.   
  16.     // 创建日志对象  
  17.     YAOLOG_CREATE(LOGID_I, true, YaoUtil::LOG_TYPE_TEXT);  
  18.     YAOLOG_CREATE(LOGID_B, true, YaoUtil::LOG_TYPE_BIN);  
  19.     YAOLOG_CREATE(LOGID_FB, true, YaoUtil::LOG_TYPE_FORMATTED_BIN);  
  20.   
  21.     LOGA__(LOGID_I, "My name is %s! I'm %d!""neil", 29);  
  22.   
  23.     // 设置日志对象的属性:输出日志到控制台窗口和文件  
  24.     YAOLOG_SET_LOG_ATTR(LOGID_I, true, YaoUtil::LOGOUT_FLAG_STDOUT | YaoUtil::LOGOUT_FLAG_FILE, truefalsetruetrue, NULL);  
  25.     LOGW__(LOGID_I, L"My name is %s! I'm %d!", L"neil", 29);  
  26.   
  27.     // 设置日志对象的属性:输出日志到文件和http服务器  
  28.     YAOLOG_SET_LOG_ATTR(LOGID_I, true, YaoUtil::OUT_FLAG_FILE | YaoUtil::OUT_FLAG_REMOTE, truetruetruetrue"http://192.168.1.195/default.aspx");   
  29.     YAOLOG_SET_LOGFILE_ATTR(LOGID_I, falsefalsefalse"c:\\logfile""tt.log");   
  30.     LOG__(LOGID_I, _T("My name is %s! I'm %d!"), _T("neil"), 29);  
  31.   
  32.     // 设置日志对象的属性:使用ini文件  
  33.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_I, "logconfig.ini");  
  34.     for (int i = 0; i < 100; i++)  
  35.     {  
  36.         LOGA__(LOGID_I, "You can modify the ini file and view effect(%d)!", i);  
  37.         Sleep(500);  
  38.     }  
  39.   
  40.     // 二进制日志   
  41.     YAOLOG_CREATE(LOGID_B, true, YaoUtil::LOG_TYPE_BIN);  
  42.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_B, "logconfig.ini");  
  43.     char buf[10] = { 0,1,2,3,4,5,6,7,8,9 };  
  44.     LOGBIN__(LOGID_B, buf, 10);  
  45.   
  46.     // 格式化的二进制日志  
  47.     YAOLOG_CREATE(LOGID_FB, true, YaoUtil::LOG_TYPE_FORMATTED_BIN);  
  48.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_FB, "logconfig.ini");   
  49.     char data1[4] = { 0,1,2,3 };  
  50.     char data2[4] = { 4,5,6,7 };  
  51.     LOGBIN_F__(LOGID_FB, "send", data1, 4);  
  52.     LOGBIN_F__(LOGID_FB, "recv", data2, 4);  
  53.   
  54.     std::cin.get();  
  55.   
  56.     // 清理,在程序退出前调用  
  57.     YAOLOG_EXIT;  
  58.     return 0;  
  59. }  

0

       

        写代码总免不了要看日志。就C++而言,不少程序员只是简单地用printf来输出日志,或者临时写个日志类,log4cpp等比较“重型”的日志库的使用率反而并不怎么高(至少从我经历的项目而言)。也许是不想为不需要的功能付出额外的学习成本,但无论如何,对于通用类别的工具采取临时手写的方式来应付,从长远考虑,在功能性和健壮性方面是得不偿失的。写这个日志类(yaolog)的最初的想法只是为了实现“输出到文件的带有时间信息的printf”,后来历经不同项目需求的“拷问”,借鉴和引用了很多开源代码(在此对那些作者表示感谢),就成了现在这个样子。yaolog的主要特点如下:

        # printf风格的接口,包括LOGA__, LOGW__, LOG__, LOGBIN__, LOGBIN_F__
        # 日志附加信息包括时间,源代码文件,函数,行号
        # 每个日志对象都有单独的行为
        # 在程序运行时通过配置ini文件动态改变日志行为
        # 可以输出到控制台窗口,文件,http服务器
        # 线程安全
        # 跨平台(windows, linux)

        

v1.6新加功能:
1 可以输出格式化的二进制日志(见上图),非常方便对socket通信之类进行debug
2 可以设置每天自动生成新的日志文件


        这里有一个重点就是尽可能的简单,我对接口修改过多次,为了尽量做到简单易用和自解释。而上述功能都是从实际项目的需求中提炼出来的,比如为什么每个日志对象需要有单独的行为?看日志文件最大的烦恼就是内容太多太杂不容易找到需要的,那么yaolog给出一种解决方法是设置不同的日志对象,如果想专门查看socket日志,可以只启用socket日志对象,或者将socket日志专门输出到一个文件,而这些都是可以在程序运行时动态配置的。又比如发送日志到http服务器,起因于某次有个用户在QQ上报了一个bug,这个bug如果在有日志的debug版本下应该能很快确定原因,但是release版本是没有日志的。当然,也可以给用户一个带日志的dll去替换,但是这种方法至少存在两个问题:版本控制(新的dll和用户原来的dll一致吗)和日志查看(用户怎样将日志提交给开发人员,不要高估了小白)。于是就想到要在服务器端控制日志的启用,以及将日志内容发送到服务器进行分析。

         yaolog v1.6的代码和demo在这里

        另外我在codeproject上发了一篇详细说明,地址在这里

        如果你觉得这个工具好用请回帖支持一下。有什么问题或建议可以留言讨论。


        下面贴一段简单的测试代码:

[cpp]  view plain   copy
  1. #include <iostream>  
  2. #include "yaolog.h"  
  3.   
  4.   
  5. // 日志对象的ID,可以自定义,不能雷同  
  6. #define LOGID_I "info"  
  7. #define LOGID_B "bin"  
  8. #define LOGID_FB "formatted_bin"  
  9.   
  10.   
  11. int main()  
  12. {  
  13.     // 初始化,在程序入口点调用  
  14.     YAOLOG_INIT;  
  15.   
  16.     // 创建日志对象  
  17.     YAOLOG_CREATE(LOGID_I, true, YaoUtil::LOG_TYPE_TEXT);  
  18.     YAOLOG_CREATE(LOGID_B, true, YaoUtil::LOG_TYPE_BIN);  
  19.     YAOLOG_CREATE(LOGID_FB, true, YaoUtil::LOG_TYPE_FORMATTED_BIN);  
  20.   
  21.     LOGA__(LOGID_I, "My name is %s! I'm %d!""neil", 29);  
  22.   
  23.     // 设置日志对象的属性:输出日志到控制台窗口和文件  
  24.     YAOLOG_SET_LOG_ATTR(LOGID_I, true, YaoUtil::LOGOUT_FLAG_STDOUT | YaoUtil::LOGOUT_FLAG_FILE, truefalsetruetrue, NULL);  
  25.     LOGW__(LOGID_I, L"My name is %s! I'm %d!", L"neil", 29);  
  26.   
  27.     // 设置日志对象的属性:输出日志到文件和http服务器  
  28.     YAOLOG_SET_LOG_ATTR(LOGID_I, true, YaoUtil::OUT_FLAG_FILE | YaoUtil::OUT_FLAG_REMOTE, truetruetruetrue"http://192.168.1.195/default.aspx");   
  29.     YAOLOG_SET_LOGFILE_ATTR(LOGID_I, falsefalsefalse"c:\\logfile""tt.log");   
  30.     LOG__(LOGID_I, _T("My name is %s! I'm %d!"), _T("neil"), 29);  
  31.   
  32.     // 设置日志对象的属性:使用ini文件  
  33.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_I, "logconfig.ini");  
  34.     for (int i = 0; i < 100; i++)  
  35.     {  
  36.         LOGA__(LOGID_I, "You can modify the ini file and view effect(%d)!", i);  
  37.         Sleep(500);  
  38.     }  
  39.   
  40.     // 二进制日志   
  41.     YAOLOG_CREATE(LOGID_B, true, YaoUtil::LOG_TYPE_BIN);  
  42.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_B, "logconfig.ini");  
  43.     char buf[10] = { 0,1,2,3,4,5,6,7,8,9 };  
  44.     LOGBIN__(LOGID_B, buf, 10);  
  45.   
  46.     // 格式化的二进制日志  
  47.     YAOLOG_CREATE(LOGID_FB, true, YaoUtil::LOG_TYPE_FORMATTED_BIN);  
  48.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_FB, "logconfig.ini");   
  49.     char data1[4] = { 0,1,2,3 };  
  50.     char data2[4] = { 4,5,6,7 };  
  51.     LOGBIN_F__(LOGID_FB, "send", data1, 4);  
  52.     LOGBIN_F__(LOGID_FB, "recv", data2, 4);  
  53.   
  54.     std::cin.get();  
  55.   
  56.     // 清理,在程序退出前调用  
  57.     YAOLOG_EXIT;  
  58.     return 0;  
  59. }  

猜你喜欢

转载自blog.csdn.net/mao834099514/article/details/77328150