日志输出及测试(自定义在日志)---可与异常处理机制联用

自定义的日志文件:用于监控程序执行中的重要环节的执行情况,在各部添加日志输出功能,可与异常处理try…catch…联合使用监控程序异常,减少报错卡死的情况发生。本例提供相应的日志输出代码包含测试代码。

//头文件段
#ifndef NETDATALOG_H
#define NETDATALOG_H
#include <atlstr.h>
#include
#include
#include <stdio.h>
#include <direct.h>
#include
#include <io.h>
#include <stdlib.h>
#include <windows.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
//头文件段

//代码实现段
#include <stdio.h>
#include “NetDataLog.h”
#pragma warning(disable:4996)
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); //原来的获取时间的方式
*/
SYSTEMTIME st;
GetLocalTime(&st);
char strTime[100] = { 0 };
if (m_timeFormat == NETLOG)
sprintf(strTime, “%4d\%02d\%02d %02d.%02d.%02d.%03d”, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond,st.wMilliseconds);
else
sprintf(strTime, “%02d-%02d %02d:%02d:%02d:%03d”, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
return string(strTime);

}
//代码实现段

//测试段
int main()
{
time_t seconds = time(NULL); //获取时间
struct tm *p;
p = localtime(&seconds);//获取本地时间
char dirPath[100] = { 0 };
sprintf(dirPath, “D:\%d%s\%d”, 1900 + p->tm_year,“log”,p->tm_mon);
char failPath[100] = { 0 };
sprintf(failPath, “%d_%d_%d”, 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);

NetDataLog data_log(dirPath, failPath, 512, 30, 0);

for (int i = 0; i < 512;i++)
{	
	data_log.addLog("error:fail to accept .bmp!");
}

return 0;

}
//测试段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值