Zlog日志框架学习笔记
一、
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日志框架学习笔记相关推荐
- Java日志框架学习笔记
Java日志框架学习笔记 文章目录 0 主流Java日志框架 1 log4j 1.1 理论知识 1.1.1 Loggers日志记录器 1.1.2 Appenders输出端 1.1.3 Layout日志 ...
- SpringMVC框架--学习笔记(下)
接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...
- [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP
上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(五):SpringA ...
- Spring框架学习笔记,超详细!!(4)
Java小白开始学习Spring框架,一方面,跟着视频学习,并记录下学习笔记,方便以后复习回顾.另一方面,发布学习笔记来约束自己,学习路程还很遥远,继续加油坚持!!!希望能帮助到大家! 另外还有我的牛 ...
- kratos mysql_kratos微服务框架学习笔记一(kratos-demo)
本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服 ...
- SpringMVC框架--学习笔记(上)
1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...
- mybatis框架--学习笔记(下)
上篇:mybatis框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81034021 8.高级映射: (1)一对一查询: ①使 ...
- mybatis框架--学习笔记(上)
使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...
- JavaSE中Map框架学习笔记
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
最新文章
- 寻找带环的链表的柄长
- Android数据存储——2.文件存储_B_资源文件
- 页面加载进度条改进版
- C语言合理字符的代码,改善C语言程序代码的125个建议,第62到89个建议!
- Android上玩玩Hook?
- PHP参数会被用作对象名
- ReactJs和React Native的那些事
- 苹果cms快鸭影视海螺精品模板
- iPhone 12 mini被“阉割”到惨不忍睹,5G都没了
- C语言学习笔记---结构体中的字符数组和字符指针
- Linux系统调用表(x86_64)
- 给mac配置adb 路径
- vue实践06-项目实践
- python 国产_再体验国产最好的Python IDE之NovalIDE
- 从有限状态机(FSM)到行为树(Behavior Tree)(2)
- 吴恩达《cs229-机器学习》:1、梯度下降法与一元线性回归
- 汽车智能电气技术分析
- 弹簧设计计算软件简介
- 三维点云处理(5)——Clustering
- 一个安全删除文件的shell命令