一、背景

c库都有现成的打印函数可用,为什么还要实现自己的打印函数?原因很简单,实现自己的打印函数除了可以实现自己需求的打印格式,还有很多优点,可以实现打印开关控制和优先级控制,还可以根据需要添加自己的功能。
你在调试的时候,增加一个宏开关,就可以打开或关闭,维护起来更方便,如下面的代码。

二、实例

当我们定义DEBUG开关宏时,LOG()函数实现正常的打印功能;当我们删掉这个DEBUG宏时,LOG()函数就是一个空函数。通过这个宏,我们实现了打印函数的开关功能。
除此之外,我们还可以设置一些打印等级。可以分为ERROR、WARNNING、INFO等打印等级。

#include <stdio.h>

#include <stdarg.h>

#define ERR_LEVEL 1
#define WARN_LEVEL 2
#define INFO_LEVEL 3

#define DEBUG_LEVEL 3 //打印等级的设置
/*
0:关闭打印
1:只打印错误信息
2:打印警告和错误信息
3:打印所有信息
*/

void attribute((format(printf,1,2))) INFO(char *fmt,…)
{
#if(DEBUG_LEVEL >= INFO_LEVEL)
va_list args;
va_start(args,fmt);
vprintf(fmt,args);
va_end(args);
#endif
}

void attribute((format(printf,1,2))) WARN(char *fmt,…)
{
#if(DEBUG_LEVEL >= WARN_LEVEL)
va_list args;
va_start(args,fmt);
vprintf(fmt,args);
va_end(args);
#endif
}

void attribute((format(printf,1,2))) ERR(char *fmt,…)
{
#if(DEBUG_LEVEL >= ERR_LEVEL)
va_list args;
va_start(args,fmt);
vprintf(fmt,args);
va_end(args);
#endif
}

int main(void)
{
ERR(“ERR log level:%d\n”,1);
WARN(“WARN log level: %d\n”,2);
INFO(“INFO log level:%d\n”,3);
return 0;
}

实现自己的日志打印系统相关推荐

  1. android 系统/本地日志打印

    android 本地日志打印 提示 博主:章飞_906285288 博客地址:http://blog.csdn.net/qq_29924041 转载请注明出处 前言   离上一篇博客大概有快四个月没有 ...

  2. ios 打印 详细错误日志_iOS中打印系统详细日志

    Q:如何打印当前的函数和行号? A:我们可以在打印时使用一些预编译宏作为打印参数,来打印当前的函数和行号.如: 1 NSLog(@"%s:%d obj=%@", __func__, ...

  3. spring boot所打的jar在服务器启动时,日志打印时间、jar所使用时间和系统当前时间不一致

    1.spring boot所打的jar在服务器启动时,日志打印时间.jar所使用时间和系统当前时间不一致 1)系统时间 2)日志打印时间 2.解决方法 在启动的时间添加-Duser.timezone= ...

  4. 增加内核的ceph模块的日志打印

    本文主要是在梳理cephfs内核方式挂载的内核代码逻辑所做的准备 环境:Centos 7.5 内核源码版本:3.10.0-862.el7.x86_64 打开ceph模块的debug信息 单独编译cep ...

  5. ELK 搭建 TB 级海量日志监控系统,这个太强了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 作者:非洲羚羊 来源:cnblogs.com/dengbangpang/p/12961593.html 本文主要介绍怎么使用 ELK ...

  6. aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析

    java相关:springboot配置aop切面日志打印过程解析 发布于 2020-3-31| 复制链接 摘记: 这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码 ...

  7. logback不同业务的日志打印到不同文件

    logback不同业务的日志打印到不同文件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mggwct/article/details/777181 ...

  8. java占位符打印_java简单日志打印规范小记

    个人认为,如果公司一些基础类库不做约束,很可能"埋坑",形成技术债务,最终为此付出代价.本文讲解一个最基本的日志打印规范. 1. 日志打印组件 日志组件有很多,日志门面的选择有:S ...

  9. 你居然还去服务器上捞日志,搭个日志收集系统难道不香么!

    摘要 ELK日志收集系统进阶使用,本文主要讲解如何打造一个线上环境真实可用的日志收集系统.有了它,你就可以和去服务器上捞日志说再见了! ELK环境安装 ELK是指Elasticsearch.Kiban ...

最新文章

  1. 和lock一起学beego 博客系统开发为例(六)
  2. 1. golang 语言环境安装
  3. fftw_plan_dft_2d重复优化
  4. html5 长链接,Vue通过WebSocket建立长连接,连接
  5. apache commons常用工具类
  6. 阿里云python面试题_Python金典面试题
  7. WPF RichTextBox相关总结
  8. html asterisk 电话,Asterisk 常见问题
  9. ASP.NET的App_Code中放置不同语言编写的类
  10. TokenInsight:BTC新增人气缺乏,多头持仓量持续上升
  11. 小米笔记本bios版本大全_初级用户应该学习的BIOS知识
  12. 查询同一组的最大最小值及明细
  13. Netlink 0003 -- Netlink动手实践
  14. Windows 7安装 Visual Studio 2010之大战三大回合
  15. 如何使用matlab进行音频信号处理+代码编译中会遇到的问题+matlab安装包
  16. 超神四年的王者荣耀 会被英雄联盟手游顺利推塔吗?
  17. mac启动台(launchpad)图标大小调整
  18. 匈牙利命名法为何被淘汰_体育午报:15年魔咒破除!国足淘汰赛终迎一胜
  19. JavaMail连接Office 365使用XOAUTH2身份认证
  20. Python3基础语法(三)

热门文章

  1. python视频网站分类_科学网—爬取网站视频简单方法之一:python的you-get模块使用方法 - 周朝宪的博文...
  2. Hive_处理NULL的几个函数 NVL, COALESCE, NULLIF
  3. win11进系统就黑屏怎么办
  4. 专访傲游CEO陈明杰:为何微软对IE8“又爱又恨”
  5. Android AsyncTask详解
  6. matlab仿真四轮abs,ABS系统的simulink的仿真。
  7. 最新的AS下载地址,更新及时
  8. 应用PCA算法提取特征脸,重构人脸图像,并利用SVM算法进行人脸识别
  9. android led弹幕,LED弹幕手持字幕
  10. 飞速创软亮相南方信息大会,获评年度CIO优选数字化服务商