#include "stdafx.h" #include #include #include "AgentLog.h" #include "AgentEventManager.h" #include "AgentClient.h" /* * 函数名称:CAgentLog(CAgentClient*) * 概要分析:构造函数 */ CAgentLog::CAgentLog( CAgentClient *a_pAgentClient ) { m_bOpen = false; m_bShowLogInfo = false; m_nLogLineInMemory = 0; memset( m_sLogFileDir, 0, sizeof(m_sLogFileDir) ); m_pLogFile = NULL; m_pEventManager = NULL; m_nLogAgentNumber = 0; m_pAgentClient = a_pAgentClient; } /* * 函数名称:~CAgentLog() * 概要分析:析构函数 */ CAgentLog::~CAgentLog() { if( m_pLogFile != NULL ) { fclose(m_pLogFile); m_pLogFile = NULL; } } /* * 函数名称:SetOpen(bool) * 概要分析:设置日志的开关 */ void CAgentLog::SetOpen(BOOL a_bOpen) { m_bOpen = a_bOpen; if( a_bOpen == TRUE ) { // 1.获取ocx所在的当前目录 char tmpStrOcxDir[1024]; char tmpStrLogDir[1024]; char acDir[1024]; char acBuf[1024]; char acText[1024]; int i = 0; memset( tmpStrOcxDir, 0, sizeof(tmpStrOcxDir) ); memset( tmpStrLogDir, 0, sizeof(tmpStrLogDir) ); memset( acDir, 0, sizeof(acDir) ); memset( acBuf, 0, sizeof(acBuf) ); memset( acText, 0, sizeof(acText) ); ::GetModuleFileNameA( AfxGetInstanceHandle(), acDir, sizeof(acDir) ); ::GetShortPathName( acDir, acBuf, sizeof(acBuf) ); ::GetLongPathName( acBuf, acText, sizeof(acText) ); for( i=(strlen(acText)-1); i>=0; i-- ) { if( acText[i] == '\\' ) { acText[i] = '\0'; break; } } strcpy_s( tmpStrOcxDir, sizeof(tmpStrOcxDir), acText ); // 2.创建ocx日志存放目录 lstrcpy( tmpStrLogDir, tmpStrOcxDir ); strcat_s( tmpStrLogDir, "\\ocx_log\\" ); if( CreateDirectoryA(tmpStrLogDir, NULL) == FALSE ) { } // 3.保存ocx日志存放目录 strcpy_s( m_sLogFileDir, sizeof(m_sLogFileDir), tmpStrLogDir ); // 4.创建当前座席的日志文件 if( m_pLogFile == NULL ) { OpenLogFile(); } } } /* * 函数名称:SetShowLogInfo(bool) * 概要分析:设置日志的前端是否显示 */ void CAgentLog::SetShowLogInfo( BOOL a_bFlag ) { m_bShowLogInfo = a_bFlag; } /* * 函数名称:OpenLogFile() * 概要分析:打开指定的日志文件 */ void CAgentLog::OpenLogFile() { SYSTEMTIME tmpSysTime; char tmpStrLogFilePath[1024]; memset( tmpStrLogFilePath, 0, sizeof(tmpStrLogFilePath) ); if( strcmp(m_sLogFileDir,"") == 0 ) { return; } else { // 1.获取系统的当前时间,然后创建日志文件的路径 ::GetSystemTime( &tmpSysTime ); sprintf_s( tmpStrLogFilePath, 1024, "%s\\ocx_log_Agent%d_%d-%d-%d.txt", m_sLogFileDir, m_pAgentClient->GetAgentNumber(), tmpSysTime.wYear, tmpSysTime.wMonth, tmpSysTime.wDay ); // 2.查看文件是否存在,然后打开,读写追加 if( (_access_s(tmpStrLogFilePath, 0)) == 0 ) { // 3.文件存在,以追加方式打开当天的日志文件 if( fopen_s(&m_pLogFile, tmpStrLogFilePath, "at+") != 0) { ::MessageBoxA( NULL, "追加打开日志文件失败", "Test", MB_OK ); return; } } else { // 4.文件不存在,则创建当天的日志文件 if( fopen_s(&m_pLogFile, tmpStrLogFilePath, "wt+") != 0 ) { ::MessageBoxA( NULL, "读写打开一个新文件", "Test", MB_OK ); return; } } } } /* * 函数名称:CloseLogFile() * 概要分析:关闭指定的日志文件 */ void CAgentLog::CloseLogFile() { if( m_pLogFile != NULL ) { ::fclose( m_pLogFile ); m_pLogFile = NULL; } } /*****日志log操作*************************************************************/ /* * 函数名称:Log(char*,...) * 概要分析:记录信息到ocx所在目录下的文件夹 */ void CAgentLog::Log( char *a_sFormat, ... ) { if( m_bOpen == TRUE ) { // 1.判断文件指针是否为NULL if( m_pLogFile == NULL ) { OpenLogFile(); } // 2.记录系统的时间 SYSTEMTIME tmpSysTime; ::GetLocalTime( &tmpSysTime); // 3.格式化消息内容 char tmpStrSzMsg[1024]; va_list ap; memset( tmpStrSzMsg, 0, sizeof(tmpStrSzMsg) ); va_start( ap, a_sFormat ); vsprintf_s( tmpStrSzMsg, a_sFormat, ap ); // 4.把时间也存到消息内容里面: char tmpSzLogInfo[1024]; memset( tmpSzLogInfo, 0, sizeof(tmpSzLogInfo) ); sprintf_s( tmpSzLogInfo, 1024, "[%d-%d-%d %d:%d:%d.%d] ", tmpSysTime.wYear, tmpSysTime.wMonth, tmpSysTime.wDay, tmpSysTime.wHour, tmpSysTime.wMinute, tmpSysTime.wSecond, tmpSysTime.wMilliseconds ); strcat_s( tmpSzLogInfo, sizeof(tmpSzLogInfo), tmpStrSzMsg ); strcat_s( tmpSzLogInfo, sizeof(tmpSzLogInfo), "\n" ); // 3.把消息内容写入到文件中,录入计数器累加 if( m_pLogFile == NULL ) { return; } ::fputs( tmpSzLogInfo, m_pLogFile ); m_nLogLineInMemory++; // 4.触发前端信息显示事件 if( m_bShowLogInfo == TRUE ) { CString tmpStrMsg; tmpStrMsg.Format( "%s", tmpSzLogInfo ); m_pAgentClient->GetEventManager()->Fire_Evt_ShowInfo( tmpStrMsg ); } // 5.查看在内存中日志录入的行数 if( m_nLogLineInMemory >= MAX_LOG_LINE_IN_MEMORY ) { // 6.清空录入计数器 m_nLogLineInMemory = 0; // 7.把内存中的数据记录到磁盘日志文件 CloseLogFile(); // 8.然后再次打开磁盘日志文件 OpenLogFile(); } } } /* * 函数名称:Log(CString) * 概要分析:录入信息到磁盘文件 */ void CAgentLog::Log( CString a_sLogMsg ) { if( m_bOpen == TRUE ) { // 1.判断文件指针是否为NULL if( m_pLogFile == NULL ) { OpenLogFile(); } // 2.标准化消息内容,把CString字符串对象转换为char*字符串指针 char *tmpLpStrMsg = NULL; tmpLpStrMsg = a_sLogMsg.GetBuffer(); // 3.把消息内容写入到文件中,录入计数器累加 if( m_pLogFile == NULL ) { return; } ::fputs( tmpLpStrMsg, m_pLogFile ); m_nLogLineInMemory++; // 4.触发前端信息显示事件 if( m_bShowLogInfo == TRUE ) { CString tmpStrShowInfo = a_sLogMsg+"\n"; m_pAgentClient->GetEventManager()->Fire_Evt_ShowInfo( tmpStrShowInfo ); } // 5.查看在内存中日志录入的行数 if( m_nLogLineInMemory >= MAX_LOG_LINE_IN_MEMORY ) { // 6.清空录入计数器 m_nLogLineInMemory = 0; // 7.把内存中的数据记录到磁盘日志文件 CloseLogFile(); // 8.然后再次打开磁盘日志文件 OpenLogFile(); } // 9.一定要记得调用CString.ReleaseBuffer(),避免内存泄露 a_sLogMsg.ReleaseBuffer(); } }