Files
Client/Server/ManageTool/MonitoringTool/MonitoringToolLog.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

146 lines
4.8 KiB
C++

#include "stdafx.h"
#include "MonitoringTool.h"
#include "MonitoringToolLog.h"
#include "MonitoringToolSetup.h"
#include <Log/ServerLog.h>
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <UserManage/UserStatistics.h>
#include <Utility/Setup/ServerSetup.h>
CServerLog g_ChattingLog("ChatLog", 0);
CServerLog g_UserStatLog("UserStatLog", 0);
CMonitoringToolLog::CMonitoringToolLog()
{
}
CMonitoringToolLog::~CMonitoringToolLog()
{
}
/// \brief 채팅 패킷을 파싱하여 로그로 출력
/// \param lpChatData 채팅 패킷
bool CMonitoringToolLog::WriteChatLog(ChatToolPkt::ChatDataSend* lpChatData)
{
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
SERVER_ID serverID;
serverID.dwID = lpChatData->m_dwServerID;
char strRecvMsg[UCHAR_MAX * 2];
memcpy(strRecvMsg, reinterpret_cast<char*>(lpChatData + 1), lpChatData->m_cChatMsgLen);
strRecvMsg[lpChatData->m_cChatMsgLen] = 0;
if(lpChatData->m_cChatType == PktChat::DICE)
{
g_ChattingLog.Log("[%04d-%02d-%02d %02d:%02d:%02d]"
"[ServerID:0x%08x][Group:%-15s][Zone:%2d][CH:%2d][X:%4d][Z:%4d][UID:%10d][CID:%10d][Type:%2d][S:%-15s][T:%-15s][주사위:%s]\r\n",
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
lpChatData->m_dwServerID, theApp.GetServerName((unsigned int)serverID.GetGroup()), serverID.GetZone(), serverID.GetChannel(),
lpChatData->m_usXPos, lpChatData->m_usZPos, lpChatData->m_dwUID, lpChatData->m_dwCID, lpChatData->m_cChatType + 1,
lpChatData->m_szSenderName, lpChatData->m_szTargetName, strRecvMsg);
}
else
{
g_ChattingLog.Log("[%04d-%02d-%02d %02d:%02d:%02d]"
"[ServerID:0x%08x][Group:%-15s][Zone:%2d][CH:%2d][X:%4d][Z:%4d][UID:%10d][CID:%10d][Type:%2d][S:%-15s][T:%-15s][%s]\r\n",
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
lpChatData->m_dwServerID, theApp.GetServerName((unsigned int)serverID.GetGroup()), serverID.GetZone(), serverID.GetChannel(),
lpChatData->m_usXPos, lpChatData->m_usZPos, lpChatData->m_dwUID, lpChatData->m_dwCID, lpChatData->m_cChatType + 1,
lpChatData->m_szSenderName, lpChatData->m_szTargetName, strRecvMsg);
}
return true;
}
bool CMonitoringToolLog::WriteAdminLog(unsigned char cChatType, unsigned char* szGMName, unsigned char* szUserName, unsigned char* strRecvMsg)
{
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
g_ChattingLog.Log("[%04d-%02d-%02d %02d:%02d:%02d]"
"[ServerID:0x%08x][Group:%-15s][Zone:%2d][CH:%2d][X:%4d][Z:%4d][UID:%10d][CID:%10d][Type:%2d][S:%-15s][T:%-15s][%s]\r\n",
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
0, "Tool", 0, 0, 0, 0, 0, 0, cChatType,
szGMName, szUserName, strRecvMsg);
return true;
}
/// \brief 동시 접속자 정보를 로그로 출력
/// \note 관리서버로부터 동접정보를 전달받음
bool CMonitoringToolLog::WriteUserStatLog()
{
CMonitoringToolSetup Setup = CMonitoringToolSetup::GetInstance();
const unsigned int nMaxZone = Setup.GetInt(_T("ZONE_INFO"), _T("ZONE_NUM"), 0);
const unsigned int nMaxGroup = Setup.GetInt(_T("SERVER_GROUP_INFO"), _T("SERVER_GROUP_NUM"), 0);
const unsigned int nMaxChannel = Setup.GetInt(_T("CHANNEL_INFO"), _T("CHANNEL_NUM"), 0);
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
char szKey[MAX_PATH];
CString strLog;
for (unsigned int nIndex = 0; nIndex < nMaxGroup; ++nIndex)
{
strLog.AppendFormat(_T("%04d-%02d-%02d %02d:%02d:%02d"),
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
SERVER_ID serverID;
serverID.dwID = 0;
serverID.sID.Type = CServerSetup::GameServer;
_snprintf(szKey, MAX_PATH, _T("SERVER_GROUP_INDEX_%02d"), nIndex);
serverID.sID.Group = Setup.GetInt(_T("SERVER_GROUP_INFO"), szKey, 100);
strLog.AppendFormat(_T("\t%02d"), serverID.GetGroup());
for (unsigned int nIdx = 0; nIdx < nMaxZone; ++nIdx)
{
for (unsigned int nCH = 0; nCH < nMaxChannel; ++nCH)
{
_snprintf(szKey, MAX_PATH, _T("ZONE_INDEX_%02d"), nIdx);
serverID.sID.ID = Setup.GetInt(_T("ZONE_INFO"), szKey, 100);
serverID.sID.Channel = nCH;
strLog.AppendFormat(_T("\t%4d"), CUserStatistics::GetInstance().GetUserNum(serverID.dwID));
}
}
strLog.Append(_T("\r\n"));
g_UserStatLog.Log(strLog);
}
return true;
}
/// \brief 동접로그의 컬럼명을 출력
/// \param strLog 컬럼명(예: WriteTime GroupIndex Z:01 C: 01 Z02: C:01)
/// \note 셋업에따라 컬럼명이 달라지며 로그 출력시 처음 한번만 호출된다.
bool CMonitoringToolLog::WriteUserStatLog(const CString& strLog)
{
g_UserStatLog.Log(strLog);
return true;
}
/// \brief 버퍼에 누적된 채팅로그를 출력
void CMonitoringToolLog::FlushChatLog()
{
g_ChattingLog.Flush();
}
/// \brief 버퍼에 누적된 동접로그를 출력
void CMonitoringToolLog::FlushStatLog()
{
g_UserStatLog.Flush();
}