C++打印日志输出文件

做后台服务程序很多情况下都需要打印日志输出,我这里有简单的C++使用的打印日志输出文件可以直接复制粘贴使用,很方便,直接贴代码了。
#ifndef NETDATALOG_H
#define NETDATALOG_H
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <direct.h>
#include <string>
#include <io.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>

using namespace std;
enum TIMEFORMAT
{
	NETLOG = 0,	//	[yyyy\mm\dd hh.MM.ss]
	LOGINLOG=1,	//	mm-dd hh:MM:ss
};

class NetDataLog
{
public:
	NetDataLog(string strDir = "log",string filename = "record",int maxfilesize=0,int filecount=0,int timeformat=0);
	~NetDataLog();

	void addLog(string log);	//添加日志记录到日志文件
	void fileSizeLimit();		//判断文件大小是否达到限定值
	int getCurrentLogFileSize();//获取当前日志文件的大小
	string getLogFileName();	//获取日志文件名称
	void setMaxFileSize(int);//设置文件最大大小
	void setFileName(string); //设置日志文件名
	void setFileCount(int);	//设置日志文件的个数
	void setLogDir(string strDir);		//设置日志文件目录
private:
	void fileOffset();		//文件名称进行偏移
	bool checkFolderExist(const string &strPath);
	string getCurrentTime();
	

private:
	string m_LogFileName;	//文件名
	int m_MaxFileSize;		//文件大小
	int m_FileCount;		//文件个数
	fstream *m_outputFile;	//输出文件流
	string m_strDir;		//目录
	int m_timeFormat;
	

};
#endif

cpp文件内容如下:

#include "stdafx.h"
#include "NetDataLog.h"
NetDataLog::NetDataLog(string strDir,string filename,int maxsize,int filecount,int timeFormat)
{
	m_strDir = strDir;
	m_LogFileName = m_strDir+string("\\")+filename;
	m_MaxFileSize = maxsize;
	m_FileCount = filecount;
	m_timeFormat = timeFormat;

	//判断日志目录是否存在
	if(!checkFolderExist(m_strDir.c_str()))	
	{
		_mkdir(m_strDir.c_str());
	}
	m_outputFile = new fstream;
	string strname = m_LogFileName+".txt";
 	m_outputFile->open(strname,ofstream::out|ofstream::app);	//打开日志文件
   	bool b=m_outputFile->is_open();


}
NetDataLog::~NetDataLog()
{
	if(m_outputFile)
		delete m_outputFile;
}
//********************************
//函数名:NetDataLog::checkFolderExist
//描  述:测试目录是否存在
//参  数:strPath 目录名
//返回值:存在返回真
//*************************************
bool NetDataLog::checkFolderExist( const string  & strPath)  
{  
	if(_access(strPath.data(),0) == 0)
		return true;
	else
		return false;
}  
//********************************
//函数名:NetDataLog::addLog
//描  述:向文件中添加日志信息
//参  数 log 为信息内容
//返回值:void
//*************************************
void NetDataLog::addLog(string log)
{
	string currentTime = getCurrentTime(); //获取本地时间
	if(m_timeFormat == NETLOG)
		*m_outputFile<<"["<<currentTime<<"] "<<log<<endl;
	else
		*m_outputFile<<currentTime<<" "<<log<<endl;
	//判断文件大小
	fileSizeLimit();
}
//********************************
//函数名:NetDataLog::fileSizeLimit
//描  述:判断文件大小是否达到最大值
//参  数:无
//返回值:void
//*************************************
void NetDataLog::fileSizeLimit() 
{
	int filesize = getCurrentLogFileSize();
	if(filesize>=m_MaxFileSize*1024)
		fileOffset();

} 
//********************************
//函数名:NetDataLog::fileOffset
//描  述:实现文件名的偏移
//参  数:无
//返回值:void
//*************************************
void NetDataLog::fileOffset()
{
	m_outputFile->close();	//关闭当前文件
	char filename[100]={0};
	char newfilename[100] = {0};
	for(int i = m_FileCount-1;i > 0;i--)
	{
		memset(filename,0,100);
		sprintf(filename,"%s%d.txt",m_LogFileName.data(),i);
		if(checkFolderExist(filename))  //存在
		{
			if(i == m_FileCount-1)
			{
				remove(filename);//删除文件
				continue;
			}
			//文件名序号向后偏移
			memset(newfilename,0,100);
			sprintf(newfilename,"%s%d.txt",m_LogFileName.data(),i+1);
			rename(filename,newfilename);
		}
	}
	memset(filename,0,100);
	sprintf(filename,"%s.txt",m_LogFileName.data());
	sprintf(newfilename,"%s%d.txt",m_LogFileName.data(),1);
	rename(filename,newfilename);
	m_outputFile->open(filename,ofstream::out|ofstream::app);	//打开日志文件
 }

//********************************
//函数名:NetDataLog::getCurrentLogFileSize
//描  述:计算当前日记文件的大小
//参  数:无
//返回值:文件大小(KB)
//*************************************
int NetDataLog::getCurrentLogFileSize()
{
	long long filepos = m_outputFile->tellp(); //保存当前文件位置
	m_outputFile->seekp(0,ios_base::end);			//移动到文件尾
	long long filesize = m_outputFile->tellp();	
	m_outputFile->seekp(filepos,ios_base::beg);		//恢复文件位置
	return filesize/1024;
	
}
//获取文件名
string NetDataLog::getLogFileName()
{
	return m_LogFileName+".txt";
}
//设置文件个数
void NetDataLog::setFileCount(int count)
{
	m_FileCount = count;
}
//设置文件名
void NetDataLog::setFileName(string filename)
{
	m_LogFileName = m_strDir+string("\\")+filename;
}
//设置文件大小
void NetDataLog::setMaxFileSize(int maxsize)
{
	m_MaxFileSize = maxsize;
}

//********************************
//函数名:NetDataLog::getCurrentTime
//描  述:获取本地时间
//返回值:时间字符串
//*************************************
string NetDataLog::getCurrentTime()
{
	time_t seconds = time(NULL);	//获取时间
	struct tm *p;
	p = localtime(&seconds);//获取本地时间
	char strTime[100] = {0};
	if(m_timeFormat == NETLOG)
		sprintf(strTime,"%d\\%d\\%d %d.%d.%d",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
	else
		sprintf(strTime,"%02d-%02d %02d:%02d:%02d",1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
	return string(strTime);
}


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值