/*********************************************************
*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;
}
}
}