2014年3月24日14:38:08
日志文件系统的写日志函数
1、使用VS2008创建一个带预编译头的控制台项目。
2、源文件内容:
#include "stdafx.h"
#include <direct.h>
#include <errno.h>
#include <time.h>
#include <sys/stat.h>
#include<iostream>
using namespace std;
#define LOG_FILE_MAX_SIZE 10*1024*1024
//#define LOG_FILE_MAX_SIZE 20
#define LOG_DEBUG 0
#define LOG_INFO 1
#define LOG_ERR 2
#define LOG_EMERG 3
int g_nLogLevel = LOG_DEBUG;
bool protectLogDir(char * strNowDirName,tm * pNowTm)
{
char strDirName[_MAX_PATH] = {0};
strcpy(strDirName,"CenterTransLog");
bool bSuc1 = false;
if(0 == _mkdir(strDirName))
{
printf("创建一级目录成功\n");
bSuc1 = true;
}
else
{
if(EEXIST == errno)
{
printf("一级目录存在\n");
bSuc1 = true;
}
else
{
printf("创建一级目录失败\n");
bSuc1 = false;
}
}
if(!bSuc1)
return false;
char strTmp[40]={0};
sprintf(strTmp,"\\%04d%02d",pNowTm->tm_year+1900,pNowTm->tm_mon+1);
strcat(strDirName,strTmp);
bool bSuc2 = false;
if(0 == _mkdir(strDirName))
{
printf("创建二级目录成功\n");
bSuc2 = true;
}
else
{
if(EEXIST == errno)
{
printf("二级目录存在\n");
bSuc2 = true;
}
else
{
printf("创建二级目录失败\n");
bSuc2 = false;
}
}
strcpy(strNowDirName,strDirName);
return bSuc2;
}
bool getLogFileName(char * strFileName,tm * pNowTm)
{
char strTmp[40]={0};
sprintf(strTmp,"\\%04d%02d%02d.txt",pNowTm->tm_year+1900,pNowTm->tm_mon+1,pNowTm->tm_mday);
strcat(strFileName,strTmp);
return true;
}
bool getLogFile_NewName(char * strNewFileName,char * strOldFileName,tm * pNowTm)
{
char strTmp[40]={0};
sprintf(strTmp,"_%02d%02d%2d",pNowTm->tm_hour,pNowTm->tm_min,pNowTm->tm_sec);
strncpy(strNewFileName,strOldFileName,strlen(strOldFileName)-4);
strcat(strNewFileName,strTmp);
strcat(strNewFileName,".txt");
return true;
}
void protectLogFileSize(char * strFileName,tm * pNowTm)
{
struct stat buf;
if(0 != stat(strFileName, &buf))
{
printf("获得文件大小失败\n");
return;
}
if(buf.st_size < LOG_FILE_MAX_SIZE)
return;
char strNewFileName[_MAX_PATH]={0};
if(!getLogFile_NewName(strNewFileName,strFileName,pNowTm))
{
printf("获得新文件名失败\n");
return;
}
if(0 !=rename(strFileName,strNewFileName))
{
printf("重命名文件失败\n");
return;
}
return;
}
bool getLocalTime(tm * pNowTm)
{
tm * pTm;
time_t nowTime;
nowTime = time(NULL);
pTm = localtime(&nowTime);
memcpy(pNowTm,pTm,sizeof(tm));
return true;
}
bool getLocalTimeStr(char * str,tm * pNowTm)
{
char strTmp[40]={0};
sprintf(strTmp,"%4d-%02d-%02d %02d:%02d:%02d",pNowTm->tm_year+1900,
pNowTm->tm_mon+1,pNowTm->tm_mday,pNowTm->tm_hour,pNowTm->tm_min,pNowTm->tm_sec);
strcpy(str,strTmp);
return true;
}
bool getLogLevelStr(char * strLogLevel,int nLogLevel)
{
switch(nLogLevel)
{
case LOG_DEBUG:
strcpy(strLogLevel,"调试");
break;
case LOG_INFO:
strcpy(strLogLevel,"信息");
break;
case LOG_ERR:
strcpy(strLogLevel,"错误");
break;
case LOG_EMERG:
strcpy(strLogLevel,"紧急");
break;
default:
strcpy(strLogLevel,"未知");
break;
}
return true;
}
bool writeLogFile(int nLogLevel,const char * strLog)
{
if(nLogLevel<g_nLogLevel)
return false;
tm aNowTm;
getLocalTime(&aNowTm);
char strFileName[_MAX_PATH] = {0};
if(!protectLogDir(strFileName,&aNowTm))
{
printf("创建目录失败\n");
return false;
}
getLogFileName(strFileName,&aNowTm);
protectLogFileSize(strFileName,&aNowTm);
FILE * pFileW = fopen(strFileName,"a+");
if(NULL == pFileW)
{
printf("文件打开失败\n");
return false;
}
char strTime[40] = {0};
getLocalTimeStr(strTime,&aNowTm);
char strLogLevel[40] = {0};
getLogLevelStr(strLogLevel,nLogLevel);
char strOut[80] = {0};
sprintf(strOut,"%s:%s:",strTime,strLogLevel);
fprintf(pFileW,"%s%s\n",strOut,strLog);
fclose(pFileW);
return true;
}
int main( void )
{
char ch;
writeLogFile(LOG_DEBUG,"LOG_DEBUG");
writeLogFile(LOG_INFO,"LOG_INFO");
writeLogFile(LOG_ERR,"LOG_ERR");
writeLogFile(LOG_EMERG,"LOG_EMERG");
printf("程序结束\n");
cin>>ch;
return 0;
}
1947

被折叠的 条评论
为什么被折叠?



