如果在log中记录一个变量的值,如:
const char* url = “iteye.com”;
一般要写: printf("url = %s",url);
当变量比较多的时候,万一把format里面的%s写错了,是会造成严重问题的。
更不好的地方在于:这么写麻烦罗嗦。基于程序员懒惰的天性,干脆省事,不写log
利于c、c++提供的宏 #,以及c++的函数重载,可以实现类型安全的观察变量
调用:
Watch(url) :
输出: url=iteye.com
实例:
string UniqKey::getUniqKey(const string& src) { TraceMe(UniqKey); Watch(src); }
输出:
enter UniqKey::getUniqKey getUniqKey src = “xxxxxxx" exit UniqKey::getUniqKey
上面的traceMe,利于类的析构和初始化跟踪函数入口和出口,是常见技巧。这里特别的是在里面包含了__FUNCTION__
使用起来更加简单。只需写类名,即可自动带上函数名,免得每个手拷贝函数名的麻烦
优点:
1. watch宏,类型安全,解决了printf里面的%s %d写错导致错误的问题
2.直接用变量名写入log,隐形要求把变量名取得更有意义。同时带入了函数名字,一目了然
3.TraceMe 宏,只需要写入类名,不许函数名。比常规的需要输类名加函数名简洁的多
#ifndef __SimpleLog_H #define __SimpleLog_H #include<string> using namespace std; #define Watch(VarName)\ do{\ const char * name=""#VarName; \ char fullName[100]={0};\ sprintf(fullName,"%s %s",__FUNCTION__,name);\ Trace::GetInstance()->log(fullName, VarName); }while (0) #define TraceMe(className)\ const char * __name__=""#className; \ char __functionName__[100]={0};\ sprintf(__functionName__,"%s",__FUNCTION__);\ Trace __traceMe__(__name__,__functionName__); //this is a ruby like 'p' void p(char* format,...); class Trace { public: //Trace(const char * msg=NULL); Trace(const char * msg=NULL, const char* functionName=NULL); ~Trace(); //TODO: overload all the POD void log(const char * name, int value); //void log(const char * name, float value); void log(const char * name, const std::string& value); void log(const char * name, const char * value); //void log(const char * name, CObject value); static Trace* GetInstance(); public: const char * msg; const char * functionName; static Trace* instance; }; #endif
#include "SimpleLog.h" #include <stdio.h> #include <stdarg.h> //#include "Object.h" using namespace std; void p ( char *Format, ... ) { char logContent[80960]={0}; va_list argList; va_start(argList, Format); vsnprintf(logContent, sizeof (logContent)-1, Format, argList); va_end(argList); puts(logContent); fflush(stdout); } Trace* Trace::instance = NULL; //grep -v "< exit" |grep -v "> enter" Trace::Trace(const char * msg, const char * functionName):msg(msg),functionName(functionName) { if(msg!=NULL && functionName==NULL) { p("enter %s",msg); } if(msg!=NULL && functionName!=NULL) { p("enter %s::%s",msg,functionName); } } Trace::~Trace() { if(msg!=NULL && functionName==NULL) { p("exit %s",msg); } if(msg!=NULL && functionName!=NULL) { p("exit %s::%s",msg,functionName); } } Trace* Trace::GetInstance() { if(instance==NULL) instance=new Trace(); return instance; } void Trace::log(const char * name, int value) { p("%-5s[ %-15s]= %d","", name, value); } void Trace::log(const char * name, const string& value) { log(name,value.c_str()); } void Trace::log(const char * name, const char * value) { p("%-5s[ %-15s]= %s","", name, value); }
相关推荐
linux系统下打印日志到文件中,包含当前时间,不限定日志内容和参数。用来调试软件,查看方便日志信息。
c++钩子函数:copy hook c++调用钩子函数监视复制文件操作
打日志用的,经过了windows和linux下的测试,支持多线程,附上了实例,此实例在windows下运行只要加到win32控制台程序里就行了,记得去掉预编译头,在linux下测试,只要make 就行了,makefile已经在压缩包里了
批量替换代码里函数和变量名的小工具(VC编写),可一次性替换多个文件里的多个函数和变量名称。使用方式如下: 1.用文本文档写一个替换的映射表文件,里面包含多组替换词组(一行一对替换词组),如: oldfuncname ...
本程序利用自带宏,实现历史纪录,错误日志代码,可以保存指定文件位置所在函数,行数等信息。已测试过,可以运行
linux c函数手册 c、c++函数手册 linux高级编程 3合1 linux高级编程必备 都是流传的经典,无需多解释,值得拥有
它把函数名和一些信息(如参数数量和大小)杂糅在一起, 改造成奇形怪状,只有编译器才懂的符号名。 例如,被mangle后的foo可能看起来像foo@4%6^,或者,符号名里头甚至不包括“foo”。 其中一个问题是,C++标准...
假设现在有一项任务:需要在调用某个动态库中的某个函数的之前和之后,做一些额外的处理工作。 这样的需求一般称作:插桩,也就是对于一个指定的目标函数,新建一个包装函数,来完成一些额外的功能,如动态调试等。 ...
log打印函数,功能如下: 1 可控制宏DEBUG决定log,输出等级,默认为3,输出ULOGE,ULOGW,ULOGI 2 宏LOG_TAG输出log所在的模块,可将此宏放到makefile中或.h中或.cpp赋值, 3 输出log等级,所在模块信息,所在...
Linux系统下,使用C++编写的日志类,不是linux自动的日志系统。 资源包括3个文件: MyLog.h是日志类的头文件 MyLog.cpp是日志类的实现文件 main.cpp是日志接口的测试文件 日志文件模式:每天一个日志文件,每月一个...
这个例子演示了通过mcc将.m函数编译成动态链接库供c++调用的方式实现c++和matlab的交互。具体例子介绍请结合我的博文:blog.csdn.net/arackethis/article/details/43372553
自己写的一个小小的日志库,功能比较简单,单一。主要用到__FILE_、__FUNCTION__、__FILE__等宏定义。日志主要记录文件、行数、函数名、日志信息。日志的格式最终保存为json格式,方便查看。
linux C++ 文本文件创建写入以及读取
C++ Builder实现调用打印机打印图片
本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...
常见的C++语言中变量名称的命名规则,基本涵盖了常用的一些变量说明
具体代码如下:* @FileName vsnprintf_name_line.c* @Describe A simple example for using v
本程序包含构造函数和析构函数,可以把构造函数和析构函数的作用区分开
C++类中的静态成员变量和静态成员函数的作用
linux c++ 守护线程,判断程序是否运行,不存在就启动