• Zlog日志框架学习笔记


    一、

    1、在验证程序时,往往需要使用printf输出现在的状态,以达到检测当前程序的作用

    printf("app start\n");

    2、在printf使用较多时,会出现来回注释和解除注释,此时我们可以使用另一种方式,使用define来进行定义。如果我们测试结束之后,可以将OPEN_LOG的数值改为0,这样就不会在打印

    1. #define OPEN_LOG 1
    2. #ifdef OPEN_LOG
    3. printf("app start1\n");
    4. #endif
    5. #ifdef OPEN_LOG
    6. printf("app start2\n");
    7. #endif
    8. #ifdef OPEN_LOG
    9. printf("app start3\n");
    10. #endif

    二、

    1、打印数据若出现多组,也可以使用函数的形式

    1. void text01(int a,int b)
    2. {
    3. printf("a=%d b=%d\n", a, b);
    4. }

    2、若希望打印的函数的参数是一个可变参,可以打印不定长度的数值

    1. void text02(char fmt,...)
    2. {
    3. va_list arg1;
    4. va_start(arg1, fmt);
    5. printf("%d \n", va_arg(arg1, int));
    6. printf("%d \n", va_arg(arg1, int));
    7. va_end(arg1);
    8. }
    9. void main()
    10. {
    11. int a = 10,b = 20;
    12. text02("", a, b,9);
    13. }

    此时打印出的数据分别为10和20,根据text02里输出两个数值,输出了在main中输入的前两个数值。

    3、将以上函数整理

    1. #include
    2. #include
    3. #define OPEN_LOG 1
    4. void EM_LOG(const char *fmt,...)
    5. {
    6. va_list arg;
    7. va_start(arg, fmt);
    8. char buf[vsnprintf(NULL, 0, fmt, arg)+1]; //可变参的数据长度
    9. vsnprintf(buf, sizeof(buf), fmt, arg);
    10. #ifdef OPEN_LOG
    11. printf("%s\n", buf);
    12. #endif
    13. va_end(arg);
    14. }
    15. void main()
    16. {
    17. int a = 10, b = 20;
    18. char c = 'a';
    19. EM_LOG("app start");
    20. EM_LOG("a=%d", a);
    21. EM_LOG("b=%d", b);
    22. EM_LOG("a=%d b=%d", a, b);
    23. }

    4、日志打印也可以分等级,即在某某时候,把低等级的屏蔽掉,留下高等级的

    1. #include <stdio.h>
    2. #include <stdarg.h>
    3. #define OPEN_LOG 1
    4. #define LOG_LEVEL LOG_DEBUG
    5. typedef enum
    6. {
    7. LOG_DEBUG = 0,
    8. LOG_INFO,
    9. LOG_WARN,
    10. LOG_ERROR,
    11. } E_LOGLEVEL;
    12. char * EM_LOGLevelGet(const int level)
    13. {
    14. if(level==LOG_DEBUG){
    15. return "DEBUG";
    16. }else if(level==LOG_INFO){
    17. return "INFO";
    18. }else if(level==LOG_WARN){
    19. return "WARN";
    20. }else if(level==LOG_ERROR){
    21. return "ERROR";
    22. }
    23. }
    24. void EM_LOG(const int level,const char *fmt,...)
    25. {
    26. #ifdef OPEN_LOG
    27. va_list arg;
    28. va_start(arg, fmt);
    29. char buf[vsnprintf(NULL, 0, fmt, arg)+1]; //可变参的数据长度
    30. vsnprintf(buf, sizeof(buf), fmt, arg);
    31. va_end(arg);
    32. if(level>=LOG_LEVEL)
    33. printf("%s\n", buf);
    34. #endif
    35. }
    36. void main()
    37. {
    38. int a = 10, b = 20;
    39. EM_LOG(LOG_DEBUG,"app start");
    40. EM_LOG(LOG_INFO,"a=%d", a);
    41. EM_LOG(LOG_WARN,"b=%d", b);
    42. EM_LOG(LOG_ERROR,"a=%d b=%d", a, b);
    43. }

    此时更改#define LOG_LEVEL LOG_DEBUG即可更改输出的数值,根据enum中的设置,

    如果设置为LOG_DEBUG,则输出四个

    如果设置为LOG_INFO,则输出后三个

    如果设置为LOG_WARN,则输出后两个

    如果设置为LOG_ERROR,则输出最后一个

     5、最后进行完善,并将文件分为log.c和log.h文件

    1. #include "log.h"
    2. #include
    3. #include
    4. char * EM_LOGLevelGet(const int level)
    5. {
    6. if(level==LOG_DEBUG){
    7. return "DEBUG";
    8. }else if(level==LOG_INFO){
    9. return "INFO";
    10. }else if(level==LOG_WARN){
    11. return "WARN";
    12. }else if(level==LOG_ERROR){
    13. return "ERROR";
    14. }
    15. }
    16. void EM_LOG(const int level,const char* fun,const int line,const char *fmt,...)
    17. {
    18. #ifdef OPEN_LOG
    19. va_list arg;
    20. va_start(arg, fmt);
    21. char buf[vsnprintf(NULL, 0, fmt, arg)+1]; //可变参的数据长度
    22. vsnprintf(buf, sizeof(buf), fmt, arg);
    23. va_end(arg);
    24. if(level>=LOG_LEVEL)
    25. printf("[%s] [%s %d]%s\n", EM_LOGLevelGet(level), fun, line,buf);
    26. #endif
    27. }
    28. #define EMLog(level,fmt...) EM_LOG(level,__FUNCTION__,__LINE__,fmt)
    1. #ifndef _LOG_H
    2. #define _LOG_H
    3. #define OPEN_LOG 1
    4. #define LOG_LEVEL LOG_DEBUG
    5. #define LOG_SAVE 1
    6. typedef enum
    7. {
    8. LOG_DEBUG = 0,
    9. LOG_INFO,
    10. LOG_WARN,
    11. LOG_ERROR,
    12. } E_LOGLEVEL;
    13. #define EMLog(level,fmt...) EM_LOG(level,__FUNCTION__,__LINE__,fmt)
    14. char *EM_LOGLevelGet(const int level);
    15. void EM_LOG(const int level, const char *fun, const int line, const char *fmt, ...);
    16. #endif

    main

    1. void main()
    2. {
    3. int a = 10, b = 20;
    4. EMLog(LOG_DEBUG, "app start");
    5. EMLog(LOG_INFO, "A=%d", a);
    6. EMLog(LOG_WARN, "app LOG_WARN");
    7. EMLog(LOG_ERROR, "app LPG_ERROR");
    8. }

  • 相关阅读:
    [MySQL]数据库的约束与表的设计
    基于Java NIO 写的一个简单版 Netty 服务端
    Go1.20 arena新特性示例详解
    HTML + CSS 实现矩形/圆形进度条效果 - SVG
    使用element-ui中的el-table回显已选中数据时toggleRowSelection报错
    华为云云耀云服务器L实例评测|评测使用
    离散PID控制
    Leetcode刷题详解——盛最多水的容器
    Linux_基本常用命令
    QT_day1
  • 原文地址:https://blog.csdn.net/ohhjack/article/details/127833614