Linux中调试程序使用打印日志纠错

来源:互联网 发布:最小程序员 编辑:程序博客网 时间:2024/05/22 14:34

/*********************************************************
*Author: lizhangjie
*Date: 2011-02-15
*Description: Log Printging Functions
*********************************************************/

#include "pub.h"

/*这个是全局日志文件指针,定义并初始化*/
static FILE *gpLogFile=NULL;

char *GetSystemTime()
{
      struct tm struTmNow;
      time_t struTimeNow;
      static char szSystemTime[128];

     memset(szSystemTime,'/0',sizeof(szSystemTime));

     if(time(&struTimeNow)==(time_t)-1)
     {
            printf("[ERRORS][Log.c][SystemTime()] time() failed!/n");
            return NULL;
      }

      /*转换成本地时间*/
      struTmNow=*localtime(&struTimeNow);

      sprintf(szSystemTime,"%04d%02d%02d",struTmNow.tm_year+1900,/
      struTmNow.tm_mon+1,struTmNow.tm_mday);

#ifdef __DEBUG__
      printf("[INFO][Log.c][SystemTime()] 成功获取系统时间:%s/n",szSystemTime);
#endif

      return szSystemTime;
}

char *GetPrtLogFileName()
{
      /*definition*/
      struct tm struTmNow;
      time_t struTimeNow;
      static char szFileName[256];

      /*initializing*/
      memset(szFileName,0,sizeof(szFileName));
      if(time(&struTimeNow)==(time_t)-1)
      {
            printf("[ERRORS][Log.c][GetPrtLogFileName()] time() failed!/n");
            return NULL;
}

      struTmNow=*localtime(&struTimeNow);
      sprintf(szFileName,"%04d%02d%02d.log",struTmNow.tm_year+1900,/
      struTmNow.tm_mon+1,struTmNow.tm_mday);

#ifdef __DEBUG__
      printf("[INFO][Log.c][GetPrtLogFileName()] 成功组成文件名:%s/n",szFileName);
#endif

      return szFileName;
}

int InitPrtLogFile()
{
      /*definition*/
      /*日志文件路径*/
      char szFilePath[256];
      static char szFileName[256];

      /*initializing*/
      memset(szFilePath,0,sizeof(szFilePath));
      memset(szFileName,0,sizeof(szFilePath));

      /*如果日志文件已打开,返回NORMAL*/
      if(gpLogFile!=NULL)
      {
            if(access(szFileName,F_OK|W_OK)==0)
            {
                  if(strcmp(szFileName,GetPrtLogFileName())==0)
                  {
                        printf("[INFO][Log.c][InitPrtLogFile()] 日志文件已存在!/n");
                        return NORMAL;
                  }
            }
      }

      /*获取HOME环境变量*/
      if(getenv("HOME"))
      {
            /*log日志文件夹路径位于$HOME/log*/
            sprintf(szFilePath,"%s/mysrc/test/log",getenv("HOME"));

      #ifdef __DEBUG__
            printf("组成路径:%s/n",szFilePath);
      #endif

      /*在指定目录下创建文件夹*/
      if((mkdir(szFilePath,S_IRUSR|S_IWUSR|S_IXUSR)==-1)&&(errno!=EEXIST))
      {
            printf("[ERRORS][Log.c][InitPtrLogFile()] mkdir() failed!/n");
            return EXCEPTION;
      }

#ifdef __DEBUG__
      printf("[INFO][Log.c][InitPtrLogFile()] log文件夹创建成功!/n");
#endif

      sprintf(szFileName,"%s/mysrc/test/log/%s",getenv("HOME"),GetPrtLogFileName());
      printf("[INFO][Log.c][InitPrtLogFile()] 路径和文件名获取成功:%s/n",szFileName);
      }
      else
      {
            printf("[ERRORS][Log.c][InitPtrLogFile()] getenv() failed!/n");
            return EXCEPTION;
      }

      /*关闭日志文件*/
      if(gpLogFile!=NULL)
      fclose(gpLogFile);

      gpLogFile=fopen(szFileName,"a+");
      if(gpLogFile==NULL)
      {
            printf("[ERRORS][Log.c][InitPtrLogFile()] fopen() failed!/n");
            return EXCEPTION;
      }

      if(chmod(szFileName,S_IRUSR|S_IWUSR)==-1)
      {
            printf("[ERRORS][Log.c][InitPtrLogFile()] chmod() failed!/n");
            return EXCEPTION;
      }

      return NORMAL;
}


void PrtLog(char *pszDebugStr,char *pszFormatStr,...)
{
      /*definition*/
      va_list listArg;
      static int nFileLineNum;

      if(InitPrtLogFile()==NORMAL)
      {
            va_start(listArg,pszFormatStr);

            /*将时间和打印位置写入日志文件*/
            fprintf(gpLogFile,"[%s]%s/n/t",GetSystemTime(),pszDebugStr);

            /*将日志内容写入日志文件*/
            vfprintf(gpLogFile,pszFormatStr,listArg);

            va_end(listArg);

            /*将内存缓冲中的数据回写到硬盘*/
            fflush(gpLogFile);

            /*日志文件行数超过限制时做相应处理*/
            if(nFileLineNum++>LOG_FILE_MAX_LINE_NUM)
            {
                  /*文件指针重新定位到文件打开时的初始位置*/
                  fseek(gpLogFile,0,SEEK_SET);
                  /*日志文件行数清零*/
                  nFileLineNum=0;
            }
      }
}

原创粉丝点击