日志文件系统的写日志函数

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值