根据需要分等级的打印日志(C语言)

在程序遇到问题调试时,有时候需要打印一些中间变量,观察完调试完又需要把这些打印注释掉,感觉很麻烦。所以写了一个小程序,可以设置打印日志等级。

在主程序设置要打印的日志等级debug,就把相应的等级的日志全部打出来观察。

程序用到了va_list(在C语言中解决变参问题的一组宏),相关知识可参考http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html(注意链接文章正确的程序在评论中) 。

直接上主程序:main.cpp

 1 #include"log.h"
 2 #include<stdio.h>
 3 int debug = 2; //10 为全打  1-9只打相应等级日志
 4 int main()
 5 {
 6     SetDebugLevel();
 7     char s[]="abc";
 8     int k = 7;
 9     double kk = 11.5;
10     WriteLog(1 , "1-日志是:%s\n" , "abc");
11     WriteLog(2 , "2-日志是:%s , k:%d\n" , s , k);  //WriteLog(日志等级,格式化字符串 ,不定个数的变量)
12     WriteLog(3 , "3-日志是:%s , k:%d\n" , s , k);
13     WriteLog(4 , "4-日志是:%s , k:%d\n" , s , k);
14     WriteLog(5 , "5-日志是:%s , k:%d\n" , s , k);  //debug为5 , 则只打印这一条。
15     WriteLog(6 , "6-日志是:%s , k:%d , kk = %lf\n" , s , k , kk);
16     printf("\n");
17     return 0;
18 }
日志打印等级debug为2,则只打印第11行。

日志打印等级debug为6,则只打印第15行。

日志打印等级debug为10,则全部打印。

日志打印等级为0(非1-10) , 则不做任何打印(指调用WriteLog的打印)。

调用的程序直接贴代码:log.h
1 void WriteLog(int , char * ,... );
2 void SetDebugLevel();

 具体实现代码:

log.cpp

 1 #include<stdio.h>
 2 #include <stdarg.h>
 3
 4 extern int debug;
 5 int debug_flag = 0;
 6 void WriteLog(int i,va_list va_alist,...)
 7 {
 8     va_list args;
 9     int level = i;
10     va_start(args ,va_alist);
11     if(debug_flag & 1 << (level - 1))    //注意&和<<优先级
12     {
13         vfprintf(stderr, va_alist, args);
14     }
15     va_end(args);
16 }
17 void SetDebugLevel()
18 {
19     if (debug >= 1 && debug <= 9)
20     {
21         debug_flag |= 1 << (debug-1);
22     }
23     else if(debug == 10)
24     {
25         debug_flag = 255;
26     }
27 }

至此,第一篇随笔结束。希望多多有意义的指教。

				
时间: 2024-10-19 08:04:01

根据需要分等级的打印日志(C语言)的相关文章

C语言:类似linux内核的分等级DEBUG宏(打印宏)

总结几种log打印printf函数的宏定义 http://blog.chinaunix.net/uid-20564848-id-73402.html #include <stdio.h> #define lU_DEBUG_PREFIX "##########" #define LU_DEBUG_CMD 0x01 #define LU_DEBUG_DATA 0x02 #define LU_DEBUG_ERROR 0x04 #define LU_PRINTF_cmd(msg..

Swift 中调试状态下打印日志

首先我们应该知道Swift中真个程序的入口就是在AppDelegate.swift中.所以在打印日志在 AppDelegate.swift中是这样的 import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWi

mqtt.c打印日志

mqtt中自身就带有日志系统Log.h和Log.c,这些日志文件是在客户端调用MQTTClient_create函数是初始化的,MQTTClient_create源码如下: int MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId, int persistence_type, void* persistence_context) { int rc = 0; MQTTClients *

Log4j配置的经典总结,打印日志文件,日志存库

    一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制 日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程. Log4j 由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来

02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译

?? 1  编写以下案例(下面的三个按钮都调用了底层的C语言): 项目案例的代码结构如下: 2 编写DataProvider的代码: package com.example.ndkpassdata; public class DataProvider { /** * 计算x和y的加法  apktools * * @param x * @param y * @return */ public native int add(int x,int y); /** * 给字符串后面拼接字符串   加密运算

springboot aop + logback + 统一异常处理 打印日志

1.src/resources路径下新建logback.xml 控制台彩色日志打印 info日志和异常日志分不同文件存储 每天自动生成日志 结合myibatis方便日志打印(debug模式) <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 可以在LogBack 的配置中使用相对路径--> &

使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)

说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置文件开始用的log4j.properties,结果控制台一直打印ERROR StatusLogger No log4j2 configuration file found.也就是Log4j2配置文件没找到的意思. 我就把log4j.properties文件名改成log4j2.properties,结果不报错了

打印日志编程

C++打印日志编程例子: int iCnt = 0; CString csMsg; CTime curTime; CMyLog mylog; CString csMylog; csMylog.Format("%d:\\CYJ\\ThreadTask%d.log",id); csMsg.Format("%s第%d客户端,第%d轮温循测试开始\r\n",curTime.Format("%Y-%m-%d %H.%M.%S"),id,iCnt); myl

打印日志

=============================================== #最普通的log打印 import logging log_file="/tmp/mylog.log" logging.basicConfig(filename=log_file,level=logging.DEBUG) def fun1(): logging.debug("This is running fun1") if __name__=="__main_