转自:http://cid-b270a20fc115f075.spaces.live.com/blog/cns!B270A20FC115F075!109.entry
名称:
zLog
功能:
实现对程序中函数,变量及自定义消息的记录功能。此函数仅为单线程调用,没有添加同步控制。若要在多线程中调用,可以修改日志函数或自己在程序中添加同步条件。
需要的文件:
time.h,timeb.h,stdio.h
主要函数:
void
WriteLog(int Priority,const char * Fmt,...);
功能:
负责向日志文件中写入日志
参数:
Priority :日志级别,暂没有实现。
Fmt:格式化字符串,与printf/vfprintf中的参数相同。
… :所需记录的参数。
返回值:
void
void
WriteLog(int Priority,const char * Fmt,...){
if (Priority < LOG_EMERG || Priority >= LOG_LAST_PRIORITY) {
return ;
}
__time64_t ltime;
_time64(<ime);
|
//if (!(pLogFile = fopen(pszLogFileName,"a+"))) {
// return ;
//}
|
char szDateBuf[MAX_PATH];
strcpy(szDateBuf,_ctime64(<ime));
szDateBuf[strlen(szDateBuf)-1]='/0'; //remove the
va_list vaa;
va_start(vaa,Fmt);
fprintf(pLogFile,"[%s][%08ld]",szDateBuf,GetCurrentThreadId());
vfprintf(pLogFile,Fmt,vaa);
fprintf(pLogFile,"/n");
fflush(pLogFile);
va_end(vaa);
|
//fclose(pLogFile);
|
}
|
注意表格中注释部分,若用此注释部分,便可将下面的OpenLog和CloseLog省去,但这样将导致明显的效率下降,可以从本文提供的事例中看出。
此函数中记录了日志生成的日期时间和调用的线程ID值。若要查看其它变量或函数值可以通过本函数的第三个函数实现(见本文事例)。
|
FILE* OpenLog(char * pszLogFileName);
功能:
打开日志文件。
参数:
指定日志文件的名称。
返回值:
FILE*,指向日志文件的指针。
FILE* OpenLog(char * pszLogFileName){
if (!(pLogFile = fopen(pszLogFileName,"a+"))){
return NULL;
}
return pLogFile;
}
|
此函数仅调用C语言的文件打开函数,若成功则返回文件指针
|
int CloseLog();
功能:
关闭日志文件。
参数:
无
返回值:
0:正常关闭;1:关闭文件出错。
int
CloseLog(){
int nErr = 0;
if (nErr = fclose(pLogFile)) {
return nErr;
}
return 0;
}
|
此函数调用
C
语言的文件关闭函数,成功时返回
0
,否则非
0
值。
|
应用
zLog
#include
"stdafx.h"
#include
"zCommon.h"
#include
<iostream>
using
namespace std;
void
myfunc(int var,char * ch){
WriteLog(2,"[0x%08x][%s][%s][var = %d][ch = %s]",(long )myfunc,"myfunc",__FILE__,var,ch);
}
int
_tmain(int argc, _TCHAR* argv[])
{
struct tm tmNow;
//gettimeofday(tmNow);
char * str = "This is test";
//Open log
OpenLog("c://zLog.log");
//get the start of log
DWORD dwStart = GetTickCount();
for (int i = 0; i < 50000; i++){
//Write log
WriteLog(2,"[0x%08x][%s]",(long )_tmain,"_tmain");
myfunc(10,"char");
}
//time consuming
cout << GetTickCount() - dwStart <<endl; //4884
//Close log
CloseLog();
system("pause");
return 0;
}
|
函数的调用顺序为
OpenLog,WriteLog,CloseLog
,一定不能弄错。此外还调用了函数
GetTickCount
,用此函数可以比较一下有无
OpenLog/CloseLog
的效率。
|