| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- #include "stdafx.h"
- #include <stdio.h>
- #include <io.h>
- #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();
- }
- }
|