📄 log.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 + -