做后台服务程序很多情况下都需要打印日志输出,我这里有简单的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);
- }
</div>