一、

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

printf("app start\n");

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

    #define OPEN_LOG 1#ifdef OPEN_LOGprintf("app start1\n");#endif#ifdef OPEN_LOGprintf("app start2\n");#endif#ifdef OPEN_LOGprintf("app start3\n");#endif       

二、

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

void text01(int a,int b)
{printf("a=%d b=%d\n", a, b);
}

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

void text02(char fmt,...)
{va_list arg1;va_start(arg1, fmt);printf("%d \n", va_arg(arg1, int));printf("%d \n", va_arg(arg1, int));va_end(arg1);
}void main()
{int a = 10,b = 20;text02("", a, b,9);
}

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

3、将以上函数整理

#include <stdio.h>
#include <stdarg.h>#define OPEN_LOG 1void EM_LOG(const char *fmt,...)
{va_list arg;va_start(arg, fmt);char buf[vsnprintf(NULL, 0, fmt, arg)+1];     //可变参的数据长度vsnprintf(buf, sizeof(buf), fmt, arg);#ifdef OPEN_LOGprintf("%s\n", buf);#endifva_end(arg);
}void main()
{int a = 10, b = 20;char c = 'a';EM_LOG("app start");EM_LOG("a=%d", a);EM_LOG("b=%d", b);EM_LOG("a=%d b=%d", a, b);}

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

#include <stdio.h>
#include <stdarg.h>#define OPEN_LOG 1
#define LOG_LEVEL LOG_DEBUGtypedef enum
{LOG_DEBUG = 0,LOG_INFO,LOG_WARN,LOG_ERROR,
} E_LOGLEVEL;char * EM_LOGLevelGet(const int level)
{if(level==LOG_DEBUG){return "DEBUG";}else if(level==LOG_INFO){return "INFO";}else if(level==LOG_WARN){return "WARN";}else if(level==LOG_ERROR){return "ERROR";}
}void EM_LOG(const int level,const char *fmt,...)
{#ifdef OPEN_LOGva_list arg;va_start(arg, fmt);char buf[vsnprintf(NULL, 0, fmt, arg)+1];     //可变参的数据长度vsnprintf(buf, sizeof(buf), fmt, arg);va_end(arg);if(level>=LOG_LEVEL)printf("%s\n", buf);#endif
}void main()
{int a = 10, b = 20;EM_LOG(LOG_DEBUG,"app start");EM_LOG(LOG_INFO,"a=%d", a);EM_LOG(LOG_WARN,"b=%d", b);EM_LOG(LOG_ERROR,"a=%d b=%d", a, b);}

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

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

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

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

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

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

#include "log.h"
#include <stdio.h>
#include <stdarg.h>char * EM_LOGLevelGet(const int level)
{if(level==LOG_DEBUG){return "DEBUG";}else if(level==LOG_INFO){return "INFO";}else if(level==LOG_WARN){return "WARN";}else if(level==LOG_ERROR){return "ERROR";}
}void EM_LOG(const int level,const char* fun,const int line,const char *fmt,...)
{#ifdef OPEN_LOGva_list arg;va_start(arg, fmt);char buf[vsnprintf(NULL, 0, fmt, arg)+1];     //可变参的数据长度vsnprintf(buf, sizeof(buf), fmt, arg);va_end(arg);if(level>=LOG_LEVEL)printf("[%s] [%s %d]%s\n", EM_LOGLevelGet(level), fun, line,buf);#endif
}#define EMLog(level,fmt...) EM_LOG(level,__FUNCTION__,__LINE__,fmt)
#ifndef _LOG_H
#define _LOG_H#define OPEN_LOG 1
#define LOG_LEVEL LOG_DEBUG
#define LOG_SAVE 1typedef enum
{LOG_DEBUG = 0,LOG_INFO,LOG_WARN,LOG_ERROR,
} E_LOGLEVEL;#define EMLog(level,fmt...) EM_LOG(level,__FUNCTION__,__LINE__,fmt)
char *EM_LOGLevelGet(const int level);
void EM_LOG(const int level, const char *fun, const int line, const char *fmt, ...);#endif

main

void main()
{int a = 10, b = 20;EMLog(LOG_DEBUG, "app start");EMLog(LOG_INFO, "A=%d", a);EMLog(LOG_WARN, "app LOG_WARN");EMLog(LOG_ERROR, "app LPG_ERROR");
}

Zlog日志框架学习笔记相关推荐

  1. Java日志框架学习笔记

    Java日志框架学习笔记 文章目录 0 主流Java日志框架 1 log4j 1.1 理论知识 1.1.1 Loggers日志记录器 1.1.2 Appenders输出端 1.1.3 Layout日志 ...

  2. SpringMVC框架--学习笔记(下)

    接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...

  3. [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP

    上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(五):SpringA ...

  4. Spring框架学习笔记,超详细!!(4)

    Java小白开始学习Spring框架,一方面,跟着视频学习,并记录下学习笔记,方便以后复习回顾.另一方面,发布学习笔记来约束自己,学习路程还很遥远,继续加油坚持!!!希望能帮助到大家! 另外还有我的牛 ...

  5. kratos mysql_kratos微服务框架学习笔记一(kratos-demo)

    本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服 ...

  6. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  7. mybatis框架--学习笔记(下)

    上篇:mybatis框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81034021 8.高级映射: (1)一对一查询: ①使 ...

  8. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  9. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

最新文章

  1. 寻找带环的链表的柄长
  2. Android数据存储——2.文件存储_B_资源文件
  3. 页面加载进度条改进版
  4. C语言合理字符的代码,改善C语言程序代码的125个建议,第62到89个建议!
  5. Android上玩玩Hook?
  6. PHP参数会被用作对象名
  7. ReactJs和React Native的那些事
  8. 苹果cms快鸭影视海螺精品模板
  9. iPhone 12 mini被“阉割”到惨不忍睹,5G都没了
  10. C语言学习笔记---结构体中的字符数组和字符指针
  11. Linux系统调用表(x86_64)
  12. 给mac配置adb 路径
  13. vue实践06-项目实践
  14. python 国产_再体验国产最好的Python IDE之NovalIDE
  15. 从有限状态机(FSM)到行为树(Behavior Tree)(2)
  16. 吴恩达《cs229-机器学习》:1、梯度下降法与一元线性回归
  17. 汽车智能电气技术分析
  18. 弹簧设计计算软件简介
  19. 三维点云处理(5)——Clustering
  20. 一个安全删除文件的shell命令

热门文章

  1. 小猫爪:PMSM之FOC控制08-状态观测器的引入
  2. 前目的地罗伯森是谁_《前目的地》阴谋论,还有一些疑点分析
  3. 汇编指令和机器码的对应表
  4. 基于PaddleSpeech的婴儿啼哭识别
  5. @PreAuthorize 不起作用
  6. Verilog 双向端口
  7. 使用树莓派基于FFmpeg推流视频和摄像头到B站直播间
  8. Leaf-美团分布式id生成系统
  9. mdadm删除raid_软RAID管理命令mdadm详解 | 旺旺知识库
  10. 【C语言】如果要在八进制和十六进制前显示0和0x的前缀