一个简单用C语言实现的日志函数

转自: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(&ltime);
     //if (!(pLogFile = fopen(pszLogFileName,"a+"))) {
     //   return ;
     //}
     char szDateBuf[MAX_PATH];
     strcpy(szDateBuf,_ctime64(&ltime));
     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 的效率。

你可能感兴趣的:(多线程,c,struct,File,System,语言)