日志类
//Log.h
#ifndef LOG_HEAD_DEF
#define LOG_HEAD_DEF
#pragma once
#include "stdio.h"
#include <stdarg.h> ////用变参函数所必须的
#include <time.h>
#include <direct.h>
#include <mmsystem.h>
#include <tchar.h>
#pragma comment(lib, "winmm.lib")
const int CHAR_LEN = 2050;
const int WCHAR_LEN = 1025;
static char g_sResult[CHAR_LEN] = { 0 };
static wchar_t g_wsResult[WCHAR_LEN] = { 0 };
// 将宽字节wchar_t* 转换 单字节char*
static char* UnicodeToAnsi(const wchar_t* szStr)
{
int nLen = WideCharToMultiByte(CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL);
if (nLen == 0)
{
return NULL;
}
WideCharToMultiByte(CP_ACP, 0, szStr, -1, g_sResult, nLen, NULL, NULL);
return g_sResult;
}
//将单字节char* 转换 宽字节wchar_t*
static wchar_t* AnsiToUnicode(const char* szStr)
{
wchar_t* pWCHAR = NULL;
//计算pChar所指向的多字节字符串相当于多少个宽字节
DWORD dwLen = MultiByteToWideChar(CP_ACP, 0, szStr, -1, NULL, 0);
if (dwLen >= WCHAR_LEN)
{
dwLen = WCHAR_LEN - 1;
}
memset(g_wsResult, 0, sizeof(g_wsResult));
//多字节转换为宽字节
MultiByteToWideChar(CP_ACP, 0, szStr, -1, g_wsResult, dwLen);
return g_wsResult;
}
// 将单字节char* 转换 宽字节wchar_t*
static void AnsiToUnicode(const char* szStr, wchar_t *szDes)
{
if (NULL == szDes) return;
//计算pChar所指向的多字节字符串相当于多少个宽字节
DWORD dwLen = MultiByteToWideChar(CP_ACP, 0, szStr, -1, NULL, 0);
//多字节转换为宽字节
MultiByteToWideChar(CP_ACP, 0, szStr, -1, szDes, dwLen);
}
static bool TraceDebug(TCHAR* lpszFormat, ...)
{
if (lpszFormat == NULL)return false;
va_list args;
TCHAR sTemp[512] = { 0 };
va_start(args, lpszFormat);
_vsntprintf(sTemp, ARRAYSIZE(sTemp), lpszFormat, args);
va_end(args);
TCHAR sTrace[1024] = { 0 };
_sntprintf_s(sTrace, ARRAYSIZE(sTrace), TEXT(" %s\r\n"), sTemp);
//OutputDebugString(sTrace);
return true;
}
class WHLogControl
{
public:
static byte m_cbLogStatus;
//静态变量
protected:
static WHLogControl * m_pLogControl; //对象指针
public:
WHLogControl();
~WHLogControl();
public:
//打开与关闭日志
static void SetLogStatus(byte cbStatus);
//获取日志
static byte GetLogStatus();
//写日志
static void LogPrintf(WORD wServerID, char * szServerName, const char* pszFormat, ...);
//写日志 clq 注释
static void LogPrintf(WORD wServerID, TCHAR * szServerName, const TCHAR* pszFormat, ...);
public:
WHLogControl * GetInstance()
{
return m_pLogControl;
}
};
#endif
//Log.cpp
#include <windows.h>
#include "Log.h"
#include <locale.h>
//初始化日志状态
byte WHLogControl::m_cbLogStatus = 0;
WHLogControl::WHLogControl()
{
}
WHLogControl::~WHLogControl()
{
}
void WHLogControl::SetLogStatus(byte cbStatus)
{
m_cbLogStatus = cbStatus;
}
byte WHLogControl::GetLogStatus()
{
return m_cbLogStatus;
}
void WHLogControl::LogPrintf(WORD wServerID, char * szServerName, const char* pszFormat, ...)
{
if (m_cbLogStatus == 0)
{
return;
}
char sLog[1024] = { 0 };
va_list args;
va_start(args, pszFormat);
_vsnprintf(sLog, 1024, pszFormat, args);
va_end(args);
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
char sInfo[1024] = { 0 };
sprintf_s(sInfo, "open *** 日志信息 %s ", sLog);
sprintf_s(sInfo, "%d-%d-%d-%d: %s \r\n", sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sLog);
int nStatus;
//创建log文件夹
nStatus = _mkdir("Log");
char szPath[MAX_PATH] = { 0 };
if (szServerName == NULL)
{
return;
sprintf_s(szPath, "Log//%d-%d-%d-%d-%s-%d-ServerLog.txt", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, "ServerID =", wServerID);
}
else
{
sprintf_s(szPath, "Log//%d-%d-%d-%d-%s-%d-ServerLog.txt", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, szServerName, wServerID);
}
//以追加的方式打开log文件夹下的ServerLog.txt 文件,如果此文件不存在则创建
FILE *fp;
fp = NULL;
fp = fopen(szPath, "at+");
if (fp)
{
fwrite(sInfo, strlen(sInfo), 1, fp);
fclose(fp);
}
else
{
}
}
void WHLogControl::LogPrintf(WORD wServerID, TCHAR * szServerName, const TCHAR* pszFormat, ...)
{
if (pszFormat == NULL)return ;
va_list args;
TCHAR szLogContent[1024] = { 0 };
va_start(args, pszFormat);
_vsntprintf(szLogContent, ARRAYSIZE(szLogContent), pszFormat, args);
va_end(args);
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
TCHAR szPath[MAX_PATH] = { 0 };
//定义写入日志内容大小
TCHAR szInfo[2062] = { 0 };
ZeroMemory(szInfo, sizeof(szInfo));
//设置日志路径
if (szServerName != NULL)
{
wsprintf(szPath, TEXT("Log//游戏服务器异常//%d-%d-%d-%d-%s-%d-Log.txt"), sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, szServerName, wServerID);
}
else
{
wsprintf(szPath, TEXT("Log//游戏服务器异常//%d-%d-%d-%d-%s-%d-Log.txt"), sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, TEXT("ServerID="), wServerID);
}
//定义文件指针
FILE *fp = NULL;
int nErr = _wfopen_s(&fp, szPath, TEXT("at+"));
//如果文件没有打开则重新生成路径并打开
if (nErr != 0)
{
//创建log文件夹
int nStatus = _mkdir("Log");
wsprintf(szPath, TEXT("Log//%s"), TEXT("游戏服务器异常"));
nStatus = _wmkdir(szPath);
//设置路径并打开文件
if (szServerName != NULL)
{
wsprintf(szPath, TEXT("Log//游戏服务器异常//%d-%d-%d-%d-%s-%d-Log.txt"), sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, szServerName, wServerID);
}
else
{
wsprintf(szPath, TEXT("Log//游戏服务器异常//%d-%d-%d-%d-%s-%d-Log.txt"), sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, TEXT("ServerID="), wServerID);
}
nErr = _wfopen_s(&fp, szPath, TEXT("at+"));
}
//格式化写入的语言
_wsetlocale(LC_ALL, L"chs");//务必加上否则生成的文本是问号字符串
//写入文件
if (nErr == 0)
{
fwprintf_s(fp, TEXT("[%02d-%02d-%02d-%02d-%02d-%02d]: %ls\r\n"), sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, szLogContent);
fclose(fp);
fp = NULL;
}
}

浙公网安备 33010602011771号