//Coded by gdut cq in 2018.9.
#ifndef _LOG_H
#define _LOG_H
#include <vector>
#include <iostream>
DWORD WINAPI LogProc(LPVOID lpParaneter/*故障日志线程,非类函数!*/);
HANDLE hSemaphore;
CRITICAL_SECTION Jog_section; //临界区
class My_Log{
public:
My_Log(CString file);
~My_Log();
bool Open();
bool Write_to_log(CString logstr,CString levle);
bool Write_to_save();
CStdioFile _Log_File;
CString _Log_Filename;
std::vector<std::vector<CString> >::iterator iter;//二级指针
std::vector<std::vector<CString> >::iterator begin_iter;//用于记录日志队列的起点
std::vector<std::vector<CString> >::iterator end_iter;//用于记录日志队列的终点
std::vector<CString>::iterator iiter;//一级指针
std::vector<std::vector<CString> > Vector_Log_message;
CString _Log_day_now;
CString _writetext;
private:
bool Printf_test(CString str);
bool Clear_Log_before();
bool Create_Log();
CString Get_Log_time();
};
My_Log mylog("C:\\日志.log");
My_Log::My_Log(CString file)
{
_Log_Filename=file;
InitializeCriticalSection(&Jog_section);//初始化临界区变量
hSemaphore = CreateSemaphore(NULL, 0, 2000, NULL);
Vector_Log_message.resize(2000);
iter=Vector_Log_message.begin();
for(int i=0;i<2000;i++)
{
iter->resize(2);
iter++;
}
iter=Vector_Log_message.begin();//开始的时候起点和终点都是0
begin_iter=Vector_Log_message.begin();
end_iter=Vector_Log_message.begin();
}
My_Log::~My_Log()
{
_Log_File.Close();
}
bool My_Log::Open()
{
CString readtext;
// CString writetext;
CTime time;
time=CTime::GetCurrentTime();
_Log_day_now=time.Format("%Y%m%d");//20180904
if(_Log_File.Open(_T(_Log_Filename),CFile::modeCreate |CFile::modeReadWrite |
CFile::typeText|CFile::modeNoTruncate))
{
while(_Log_File.ReadString(readtext))
{
if(atoi(_Log_day_now)-atoi(readtext.Left(8))<4)
{
_writetext+=readtext;
_writetext+='\n';
}
else
continue;
}
_Log_File.Close();
if(_Log_File.Open(_T(_Log_Filename),CFile::modeCreate |CFile::modeReadWrite |
CFile::typeText))
{
// _Log_File.SeekToBegin();
_Log_File.SeekToEnd();
_Log_File.WriteString(_writetext);//此时wirtetext保存了以前的记录
// _Log_File.WriteString(_Log_day_now+'\n');
}
else
{
//open fail,do nothing;
return 0;
}
}
else
{
//open fail,do nothing;
return 0;
}
HANDLE hThreadlog=CreateThread(NULL,0,LogProc,NULL,0,NULL);
CloseHandle(hThreadlog);
return 1;
}
bool My_Log::Write_to_log(CString logstr,CString levle)
{
EnterCriticalSection(&Jog_section);
if(iter>=Vector_Log_message.end())
{
return 0;
}
begin_iter=iter;//将最新的队列下表记录下来
iiter=(*iter).begin();
*iiter=logstr;
// mylog._Log_File.WriteString("20180901 进入writetolog,数据为:"+(*iiter)+'\n');
iiter++;
*iiter=levle;
iter++;
// mylog._Log_File.WriteString("20180901 进入writetolog,level为:"+(*iiter)+'\n');
ReleaseSemaphore(hSemaphore, 1, NULL);//释放信号量
LeaveCriticalSection(&Jog_section);
return 1;
}
DWORD WINAPI LogProc(LPVOID lpParaneter)
{
CString jogstr;
CString joglevel;
std::vector<std::vector<CString> >::iterator checkiter;
std::vector<std::vector<CString> >::iterator lastiter;
while(1)
{
Sleep(10);
WaitForSingleObject(hSemaphore, INFINITE);
// mylog._Log_File.WriteString("20180901 进入线程,level为: "+(*mylog.begin_iter)[1]);
if((*mylog.begin_iter)[1]=="0"||(mylog.begin_iter-mylog.end_iter)>=10)
{
//mylog._Log_File.WriteString("20180901 进入写日志");
lastiter=mylog.begin_iter;
for(checkiter=mylog.end_iter;checkiter<=lastiter;checkiter++)
{
mylog._writetext=(*checkiter)[0];
mylog._writetext+='\n';
mylog._Log_File.SeekToEnd();
mylog._Log_File.WriteString(mylog._writetext);
}
if(lastiter<mylog.Vector_Log_message.end())
{
lastiter++;
mylog.end_iter=lastiter;
}
}
//
// EnterCriticalSection(&Jog_section);
// LeaveCriticalSection(&Jog_section);
}
return 0;
}
#endif