只有在程序出问题以后才会知道打一个好的日志有多么重。该日志类是程序exe目录下,以年月日时命名的txt 存储。
//log.h 如下:
class Log
{
public:
static Log* instance;
static Log* GetInstance();
Log();
~Log();
bool WriteLog(CString strFilePath, CString str);
bool WriteLog(CString str);
CString GetModulePathString();
CString CharToHex(unsigned char *pBuf, int len);
bool ReadLog(CString strFileName, CString& retLog);
char* ReadLog(CString strFileName, int& nFileLen);
};
//log.cpp 如下:
#include "stdafx.h"
#include "Log.h"
#include <string>
using namespace std;
Log* Log::instance = NULL;
Log::Log()
{
}
Log* Log::GetInstance(){
if (instance == NULL){
instance = new Log();
}
return instance;
}
Log::~Log()
{
}
CString Log::GetModulePathString()
{
CString sPath;
GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
sPath.ReleaseBuffer();
int nPos;
nPos = sPath.ReverseFind('\\');
sPath = sPath.Left(nPos + 1);
return sPath;
}
bool Log::WriteLog(CString strFilePath, CString str)
{
CString strWorkPath;
CString strWorkPathlog;
CString strTime;
strWorkPathlog = strFilePath;
CStdioFile file;
if (file.Open(strWorkPathlog, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite) == 0)
return false;
file.SeekToEnd(); //写追加在以前写的后面
CTime time = CTime::GetCurrentTime();
strTime = _T("[%m/%d %H:%M:%S] ");
strTime = time.Format(strTime);
str = strTime + str + _T("\r\n");
char cArray[1024];
int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), cArray, len + 1, NULL, NULL);
cArray[len] = '\0';
file.Write(cArray,len);
file.Flush();
file.Close();
return true;
}
bool Log::WriteLog(CString str)
{
CString strPath = _T("");
CString strFileName = _T("");
CTime time = CTime::GetCurrentTime();
strPath = GetModulePathString() + _T("Log\\");
if (!PathFileExists(strPath))
{
BOOL rst = CreateMultipleDirectory(strPath);
if (!rst)
{
AfxMessageBox(_T("创建目录失败"));
return false;
}
}
strFileName = _T("%Y%m%d%H");
strFileName = time.Format(strFileName) + _T(".txt");
strPath += strFileName;
WriteLog(strPath, str);
return true;
}
CString Log::CharToHex(unsigned char *pBuf, int len)
{
CString str = _T("");
CString retStr = _T("");
if (pBuf == NULL)
{
return retStr;
}
for (int i = 0; i < len; i++)
{
str.Format(_T("%02X "), pBuf[i]);
retStr += str;
}
return retStr;
}
bool Log::ReadLog(CString strFileName, CString& retLog)
{
bool bRet = false;
retLog = _T("");
CString strPath = _T("");
strPath = GetModulePathString() + _T("Log\\") + strFileName;
if (!PathFileExists(strPath))
return false;
CStdioFile file;
if (file.Open(strPath, CFile::modeNoTruncate | CFile::modeRead) == 0)
return false;
CString strLine = _T("");
retLog = _T("");
int nHour = 0;
int nMinute = 0;
int nSecond = 0;
file.SeekToBegin();
while (file.ReadString(strLine))
{
int nStart = strLine.Find(_T("[")) + 1;
int nEnd = strLine.Find(_T("]")) - 1;
CString strTmp = strLine.Mid(nStart, nEnd - nStart + 1);
int strHourPos = strTmp.Find(_T(":"));
nHour = _ttoi(strTmp.Mid(strHourPos - 2, 2));
nMinute = _ttoi(strTmp.Mid(strHourPos + 1, 2));
int nSecondPos = strTmp.Find(_T(":"), strHourPos + 1);
nSecond = _ttoi(strTmp.Mid(nSecondPos + 1, 2));
retLog += strLine;
}
file.Close();
return true;
}
char* Log::ReadLog(CString strFileName, int& nFileLen)
{
bool bRet = false;
CString strPath = _T("");
strPath = GetModulePathString() + _T("Log\\") + strFileName;
string strpath = Cstring2Char(strPath);
return ReadWholeFileAndLen(strpath.c_str(), nFileLen);
}