⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 log.cpp

📁 概述:数据的纵向收集
💻 CPP
字号:
//sunwangme@hotmail.com

//#include "default.h"
//#include <windows.h>
//#include <stdio.h>
#include "stdafx.h"
#include "log.h"
#include "debugutil.h"

//guard and exception catch,just pass
#define guard(func)			{
#define unguard				}

//for size_t conflict with DWORD
#pragma warning(disable:4267)

//static object
//CLog Log;

//////////////////////////////////////////////////////////////////////////
CLog* CLog::m_pInstance = NULL;

//////////////////////////////////////////////////////////////////////////
CLog* CLog::Instance()
{
	if(m_pInstance==NULL)
	{
		m_pInstance= new CLog();
	}
	return m_pInstance;
}

void CLog::Release()
{
	if(m_pInstance!=NULL)
	{
		delete m_pInstance;
		m_pInstance=NULL;;
	}
}

//////////////////////////////////////////////////////////////////////////
CLog::CLog()
{
	guard(CLog::CLog);

	InitializeCriticalSection(&m_csSection);

	// for log file
	for ( int nId = 0; nId < MAX_LOG_FILES; nId++)
	{
		m_hLogFile[nId] = INVALID_HANDLE_VALUE;
		InitializeCriticalSection(&m_csFileSection[nId]);
	}

	m_bDirty = true;
	m_nMonth = 0 ;
	m_nDay = 0 ;
	m_nHour = 0;
	m_nHalf = 0;

	//default server name
	wcscpy(m_pServerName,L"srvname");

	unguard;
}

CLog::~CLog()
{
	guard(CLog::~CLog);

	DeleteCriticalSection(&m_csSection);

	for ( int nId = 0 ; nId < MAX_LOG_FILES ; nId++)
	{
		if ( m_hLogFile[nId] != INVALID_HANDLE_VALUE)
		{
			FlushFileBuffers(m_hLogFile[nId]);
			CloseHandle(m_hLogFile[nId]);
		}
		DeleteCriticalSection(&m_csFileSection[nId]);
	}

	m_pInstance=NULL;
	unguard;
}

void CLog::Add(LogType type, char* format, ...)
{
	guard(CLog::Add);

	va_list ap;
	va_start(ap, format);
	AddV(type, format, ap);
	va_end(ap);

	unguard;
}

void CLog::Add(LogType type, WCHAR* format, ...)
{
	guard(CLog::Add);

	va_list ap;
	va_start(ap, format);
	AddV(type, format, ap);
	va_end(ap);

	unguard;
}

//936--简体中文
//950--繁体中文
//0--英文
static UINT __GetSystemCodePage()
{
	LCID lcidLanguage = ::GetSystemDefaultLCID();
	WORD idLangID = LANGIDFROMLCID(lcidLanguage);
	if (idLangID==MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED))
	{
		return 936;
	}
	else if (idLangID==MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US))
	{
		return 950;
	}
	else
	{
		return 0;
	}
}

static char* __UnicodeToMultibyte(LPCWSTR pszStr) 
{
	guard(UnicodeToMultibyte);

	int nMultiByteBufSize = WideCharToMultiByte(__GetSystemCodePage(), 0, (LPCWSTR)pszStr, -1, 0, 0, 0, 0);
	char *pszBuf = (char*)malloc(nMultiByteBufSize+1);
	WideCharToMultiByte(__GetSystemCodePage(), 0, (LPCWSTR)pszStr, -1, (LPSTR)pszBuf, nMultiByteBufSize, NULL, NULL);
	pszBuf[nMultiByteBufSize-1]=0;
	return pszBuf;

	unguard;
}

void CLog::AddV(LogType type, char* format, va_list ap)
{
	guard(CLog::AddV);

	char cbuffer[MAX_LOG_STRING];
	//WCHAR wbuffer[MAX_LOG_STRING];

	//2007.3.27,sunwangme,fixed
	int len = _vsnprintf(cbuffer,MAX_LOG_STRING,format, ap);
	if (len > 0) 
	{	
		//unsigned int i;
		//for (i = 0; i < strlen(cbuffer); i++)
		//{
		//	wbuffer[i] = cbuffer[i];
		//}
		//wbuffer[i] = 0;

		SYSTEMTIME tm;
		GetLocalTime(&tm);

		if(1)
		{
			// write log message to local log file
			if ( (!(ValidLogFile(tm.wYear , tm.wMonth , tm.wDay , tm.wHour, tm.wMinute < 30 ? 0 : 1 ))) )
			{
				Enter();
					CreateNewLogFile(tm.wYear , tm.wMonth , tm.wDay , tm.wHour, tm.wMinute < 30 ? 0 : 1  );
				Leave();
			}

			char lineBuffer[MAX_LOG_STRING*3];
			DWORD writeBytes;
			int nId;

			//2007.3.27,sunwangme,fixed,这里不用判断缓冲区大小了
			//PCHAR pszBuf = UnicodeToMultibyte(wbuffer);
			PCHAR pszBuf = cbuffer;
			len = sprintf(lineBuffer,"%02d/%02d/%04d %02d:%02d:%02d.%03d, %s\r\n", 
				tm.wMonth, tm.wDay, tm.wYear, tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds, pszBuf);
			//free(pszBuf);

/*
#ifdef _DEBUG_STRING
			PCHAR pszServerName= UnicodeToMultibyte(m_pServerName);
			DebugString(pszServerName,pszBuf);
			free(pszServerName);
#endif
*/
			if (len>0)
			switch(type)
			{
			case LOG_INNER:
				nId = LOG_FILE_INNER;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_OUTER:
				nId = LOG_FILE_OUTER;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_DB:
				nId = LOG_FILE_DB;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_AUDIT:
				nId = LOG_FILE_AUDIT;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_ERROR:
				nId = LOG_FILE_ERROR;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_ITEMLOG:
				nId = LOG_FILE_ITEMLOG;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			default:
				nId = LOG_FILE_SYSTEM;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			}
		}
	}

	unguard;
}

void CLog::AddV(LogType type, WCHAR* format, va_list ap)
{
	guard(CLog::AddV);

	WCHAR buffer[MAX_LOG_STRING];

	//2007.3.27,sunwangme,fixed
	int len = _vsnwprintf(buffer, MAX_LOG_STRING,format, ap);
	if (len > 0) 
	{				
		SYSTEMTIME tm;
		GetLocalTime(&tm);

		if(1)
		{
			if ( (!(ValidLogFile(tm.wYear , tm.wMonth , tm.wDay , tm.wHour, tm.wMinute < 30 ? 0 : 1  ))) ) 
			{
				Enter();
					CreateNewLogFile(tm.wYear , tm.wMonth , tm.wDay , tm.wHour, tm.wMinute < 30 ? 0 : 1  );
				Leave();
			}		

			char lineBuffer[MAX_LOG_STRING*3];
			DWORD writeBytes;
			int nId;

			PCHAR pszBuf = __UnicodeToMultibyte(buffer);
			sprintf(lineBuffer, "%02d/%02d/%04d %02d:%02d:%02d.%03d, %s\r\n", 
				tm.wMonth, tm.wDay, tm.wYear, tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds, pszBuf);
			free(pszBuf);
/*

#ifdef _DEBUG_STRING
			PCHAR pszServerName= UnicodeToMultibyte(m_pServerName);
			DebugString(pszServerName,pszBuf);
			free(pszServerName);
#endif
*/

			switch(type)
			{
			case LOG_INNER:
				nId = LOG_FILE_INNER;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_OUTER:
				nId = LOG_FILE_OUTER;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_DB:
				nId = LOG_FILE_DB;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_AUDIT:
				nId = LOG_FILE_AUDIT;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_ERROR:
				nId = LOG_FILE_ERROR;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			case LOG_ITEMLOG:
				nId = LOG_FILE_ITEMLOG;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			default:
				nId = LOG_FILE_SYSTEM;
				LogFileLock(nId);
					WriteFile(m_hLogFile[nId], lineBuffer, strlen(lineBuffer), &writeBytes, NULL);
				LogFileUnLock(nId);
				break;
			}		
		}
	}

	unguard;
}

void CLog::CreateNewLogFile(int nYear, int nMonth, int nDay, int nHour, int nHalf)
{
	guard( void CLog::CreateNewLogFile(int nYear, int nMonth, int nDay, int nHour, int nHalf ));

	if ( ValidLogFile(nYear , nMonth , nDay , nHour, nHalf) ) 
		return;

	// create log file and set pSocket->m_hLogFile
	WCHAR logFileName[256];

	// change date time
	SetLogFileDate(nYear, nMonth, nDay, nHour, nHalf);

	// unset dirty field
	m_bDirty = false;

	WCHAR wPath[MAX_PATH] ={0};
	GetModuleFileNameW((HINSTANCE)m_inst,wPath,MAX_PATH);
	WCHAR* p = wcsrchr(wPath,'\\');
	if(p)
	{
		*(p+1) = '\0';
		wcscat(wPath,L"log");
	}
	for ( int nId = 0; nId < MAX_LOG_FILES; nId++)
	{

		LogFileLock(nId);

			if ( m_hLogFile[nId] != INVALID_HANDLE_VALUE) 
			{
				FlushFileBuffers(m_hLogFile[nId]);
				CloseHandle(m_hLogFile[nId]);
			}
			
			swprintf(logFileName, L"%s\\%s\\%04d-%02d-%02d-%02d-%s-%s%d.log",wPath,
				LogCategory[nId], m_nYear, m_nMonth, m_nDay, m_nHour,m_pServerName, LogCategory[nId], m_nHalf );

			CreateDirectoryW(wPath, NULL);
			WCHAR szBuffer[MAX_PATH];
			wsprintfW(szBuffer, L"%s\\%s", wPath,LogCategory[nId]);
			CreateDirectoryW(szBuffer, NULL);

			m_hLogFile[nId] = CreateFileW(logFileName,  GENERIC_WRITE, FILE_SHARE_READ,
				NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

			if (m_hLogFile[nId] != INVALID_HANDLE_VALUE)
				SetFilePointer(m_hLogFile[nId], 0, NULL, FILE_END);

		LogFileUnLock(nId);
	}

	unguard;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -