#pragma once #define LOGTYPE_CRT 1 #define LOGTYPE_FILE_HOUR 2 #define LOGTYPE_FILE_DAY 3 #define LOGTYPE_FILE 4 // ½Ç½Ã°£ #define LOGTYPE_CRT_FILE_DAY 5 // CRT and FILE_DAY #define LOGTYPE_CRT_FILE_HOUR 6 // CRT and FILE_HOUR #define LOGTYPE_FILEDB_DAY 7 // DB and FILE_DAY #if defined( PRE_TRIGGER_LOG ) #define LOGTYPE_CRT_FILE_TRIGGER_TEST 50 // ·Î±×Å×½ºÆ®¿ë #endif // #if defined( PRE_TRIGGER_LOG ) enum Color { _RED = 0, _BLUE, _GREEN, _ERROR = _RED, _WARNING = _BLUE, _SUCCESS = _GREEN, }; struct LogType { enum eLogType { _NORMAL = 0, _ERROR, _DANGERPOINT, _FILELOG, _HACK, _HACKSHIELD, _ITEMDUPLICATE, _WEAPONTYPE, _SESSIONCRASH, _ROOMCRASH, _UNREACHABLE, _LOADINGDISCONNECT, _ROOMFINALIZECRASH, _GAMECONNECTLOG, _GAMESERVERDELAY, _ENTERGAMECHECK, _DROPITEMPENALTY, _TREASUREPENALTY, _CLEARGRADEPENALTY, _PRELOADED_DYNAMICLOAD, _DELOBJECT_NAMEKEYFINDERR, _OCTREELOG, _INVALIDACTOR, _GPKERROR, _ACCEPTORERROR, _QUESTHACK, _ZOMBIEUSER, _EVENTLIST, _FARM, _GUILDWAR, _MOVEPACKET_SEQ, //À̵¿¸Þ¼¼Áö¸¦ º¸³» ³õ°í ¸Õ°¡ ÇÒ°æ¿ì _SKILL_ACTION, _FILEDBLOG, // File, DB µÑ´Ù ³²±â±â?? _LADDER, _PVPROOM, _PING, _SENDTHREAD, _LASTVILLAGEERROR, // ¸¶Áö¸· ºô¸®Áö¼­¹ö ÀÌ»óÇÑ ·Î±× _DBCONNECTIONLOG, _ZEROPOPULATION, _RESTRICTIP, // IP·Î ³Ê¹« ¸¹Àº Á¢¼ÓÀÌ ÀÌ·ç¾îÁú °æ¿ì °ü·Ã ·Î±× _SOCIALCONNECT, // Áß±¹ ¼Ò¼È ÄÁ³ØÆ®°ü·Ã ·Î±× _ASIASOFTLOG, // _SHUTDOWN, _DBSYSTEM_ERROR, _COMEBACK, // º¹±ÍÀ¯Àú·Î±× ¼­¹öÀå¾Ö½Ã ¶Ç´Â LogoutŸÀÓ°ª °»½ÅÀÌ ¾ÈµÇ¾îÁú °æ¿ì º¹¼ö¹ø ¹ÞÀ» ¼öµµ À־ ·Î±× ´Üµð _BESTFRIEND, _BEGINNETGUILD, _REMAINEDACTOR, // NPC, ¸ó½ºÅÍ ³²¾ÆÀÖ´Â Çö»ó _PARTYERROR, // ÆÄƼ °ü·Ã ¿À·ù _GAMEQUITREWARD, _PROFESSORK_SKILL, // ÇÁ·ÎÆä¼­K ½ºÅ³ ¾È¸ØÃß´Â Çö»ó _DOORSLOG, _STEAMUSERCOUNT, }; }; #if defined( _GAMESERVER ) || defined( _VILLAGESERVER ) class CDNUserSession; #elif defined( _MASTERSERVER ) class CDNUser; #elif defined( _LOGINSERVER ) class CDNUserConnection; #elif defined( _CASHSERVER ) class CDNUserRepository; #endif // #if defined( _GAMESERVER ) #if defined (_SERVICEMANAGER_EX) class CDisplayer { public: virtual ~CDisplayer() {}; public: virtual void Display(LogType::eLogType type, const wchar_t* buf) = 0; }; #endif // #if defined (_SERVICEMANAGER_EX) class CLog { protected: #if defined( PRE_DELETE_LOGLOCK ) #else CSyncLock m_LogLock; #endif // #if defined( PRE_DELETE_LOGLOCK ) #if defined (_DBSERVER) || defined (_CASHSERVER) CSyncLock m_LogLock; #endif WCHAR m_wszFileName[256]; WCHAR m_wszDirName[256]; int m_nCounter; FILE* m_pFile; int m_nOldDay; int m_nOldHour; BYTE m_cType; bool m_bActive; int m_nServerID; void LogTypeLog(LogType::eLogType eType, WCHAR* buf); void Display(WCHAR* buf); bool Filelog(WCHAR* buf); bool DBLog( LogType::eLogType eType, int nServerID, int iWorldID, UINT uiAccountDBID, INT64 biCharDBID, UINT uiSessionID, wchar_t* buf ); void CalcCounter(); public: CLog(void); virtual ~CLog(); void Init(BYTE nType); // ±âº» µð·ºÅ丮 ¹× ÆÄÀÏ À̸§Àº log void Init(const WCHAR *pwszFileName, BYTE nType); void Init(const WCHAR *pwszDirName, const WCHAR *pwszFileName, BYTE nType); void SetServerID(int nServerID) { m_nServerID = nServerID;}; void Log( LogType::eLogType eType, char* fmt, ... ); void Log( LogType::eLogType eType, wchar_t* fmt, ... ); void Log( LogType::eLogType eType, int iWorldID, UINT uiAccountDBID, INT64 biCharDBID, UINT uiSessionID, char* fmt, ... ); void Log( LogType::eLogType eType, int iWorldID, UINT uiAccountDBID, INT64 biCharDBID, UINT uiSessionID, wchar_t* fmt, ... ); #if defined( _GAMESERVER ) || defined( _VILLAGESERVER ) void Log( LogType::eLogType eType, CDNUserSession* pSession, wchar_t* fmt, ... ); #elif defined( _MASTERSERVER ) void Log( LogType::eLogType eType, CDNUser* pUser, wchar_t* fmt, ... ); #elif defined( _LOGINSERVER ) void Log( LogType::eLogType eType, CDNUserConnection* pUser, wchar_t* fmt, ... ); #elif defined( _CASHSERVER ) void Log( LogType::eLogType eType, CDNUserRepository* pUser, wchar_t* fmt, ... ); #endif // #if defined( _GAMESERVER ) #if defined (_SERVICEMANAGER_EX) CDisplayer* m_pDisplayer; void Display(LogType::eLogType type, const wchar_t* buf); void SetDisplayer(CDisplayer* pDisplayer) { m_pDisplayer = pDisplayer; } #endif // #if defined (_SERVICEMANAGER_EX) bool SMLog(LogType::eLogType eType, int iWorldID, UINT uiAccountDBID, INT64 biCharDBID, UINT uiSessionID, wchar_t* buf); void SetActive(bool bActive) {m_bActive = bActive;} bool GetActive() {return m_bActive;} }; #if defined( _GAMESERVER ) #if defined( PRE_TRIGGER_UNITTEST_LOG ) extern CLog g_TriggerUnitTestLog; #endif // #if defined( PRE_TRIGGER_UNITTEST_LOG ) #if defined( PRE_TRIGGER_LOG ) extern CLog g_TriggerLog; #endif // #if defined( PRE_TRIGGER_LOG ) #if defined( PRE_QUESTSCRIPT_LOG ) extern CLog g_QuestLog; #endif // #if defined( PRE_QUESTSCRIPT_LOG ) extern CLog g_Log; #else extern CLog g_Log; extern CLog g_SPLog; #endif #ifdef _FINAL_BUILD #define _DANGER_POINT() {} #define _DANGER_POINT_MSG(msg) {} #else #define _DANGER_POINT() \ { g_Log.Log( LogType::_DANGERPOINT, L"DANGER_POINT [%s:%d]\r\n", \ wcschr(_T(__FILE__), '\\') ? wcschr(_T(__FILE__), '\\')+1 : _T(__FILE__), \ __LINE__); } #define _DANGER_POINT_MSG(msg) \ { g_Log.Log( LogType::_DANGERPOINT, L"DANGER_POINT [%s:%d] msg[%s]\r\n", \ wcschr(_T(__FILE__), '\\') ? wcschr(_T(__FILE__), '\\')+1 : _T(__FILE__), \ __LINE__, msg); } #endif #if defined( _GAMESERVER ) #if defined( PRE_QUESTSCRIPT_LOG ) class CScopeScriptLog { public: CScopeScriptLog( int iMapIndex, const char* pszFuncName ); ~CScopeScriptLog(); private: int m_iMapIndex; std::string m_strFuncName; LARGE_INTEGER m_liFrequency; LARGE_INTEGER m_liStartTime; LARGE_INTEGER m_liCurTime; }; #endif // #if defined( PRE_QUESTSCRIPT_LOG ) #endif // #if defined( _GAMESERVER ) #if !defined( _FINAL_BUILD ) class CPerformanceLog { public: CPerformanceLog( const char* pszName, int iOverTick=0 ); ~CPerformanceLog(); private: std::string m_strName; int m_iOverTick; LARGE_INTEGER m_liFrequency; LARGE_INTEGER m_liStartTime; LARGE_INTEGER m_liCurTime; }; #else class CPerformanceLog { public: CPerformanceLog( const char* pszName ) {} ~CPerformanceLog() {} }; #endif // #if !defined( _FINAL_BUILD ) class CExceptionCodeLog { public: CExceptionCodeLog(DWORD pExceptionCode, const wchar_t* pMsg, int nMainCmd=0, int nSubCmd=0) { g_Log.Log(LogType::_FILELOG, L"[Exception Occured] TID : %d, Code : 0x%X - %s MainCmd : %d SubCmd : %d\r\n", ::GetCurrentThreadId(), pExceptionCode, ((pMsg)?(pMsg):(L"")), nMainCmd, nSubCmd); } }; #if defined( _LOGINSERVER ) #if defined( PRE_LOGINDUMP_LOG ) class CExceptionCodeLogLoginServer { public: CExceptionCodeLogLoginServer(DWORD pExceptionCode, const wchar_t* pMsg, int nMainCmd, int nSubCmd, int nReconnectStep, CSReconnectLogin *ReconnectData) { if(ReconnectData) g_Log.Log(LogType::_FILELOG, L"[Exception Occured] TID : %d, Code : 0x%X - %s MainCmd : %d SubCmd : %d Step:%d SessionID:%d AccountDBID:%d \r\n", ::GetCurrentThreadId(), pExceptionCode, ((pMsg)?(pMsg):(L"")), nMainCmd, nSubCmd, nReconnectStep, ReconnectData->nSessionID, ReconnectData->nAccountDBID); else g_Log.Log(LogType::_FILELOG, L"[Exception Occured] TID : %d, Code : 0x%X - %s MainCmd : %d SubCmd : %d Step:%d\r\n", ::GetCurrentThreadId(), pExceptionCode, ((pMsg)?(pMsg):(L"")), nMainCmd, nSubCmd, nReconnectStep); } }; #endif #endif #if defined( PRE_ADD_QUERYTIMELOG ) class CQueryTimeLog { public: CQueryTimeLog( const char* pszQuery ); ~CQueryTimeLog(); const char* GetQueryString() {return m_strQuery.c_str();} private: std::string m_strQuery; DWORD m_dwStartTime; }; #else class CQueryTimeLog { public: CQueryTimeLog( const char* pszQuery ){} ~CQueryTimeLog(){} }; #endif // #if defined( PRE_ADD_QUERYTIMELOG ) #if defined( PRE_ADD_QUERYTIMELOG ) && !defined (_CLIENT) class CTimeParamSet { public: CTimeParamSet(CQueryTimeLog* pQuery, __time64_t& pTime64, TIMESTAMP_STRUCT& dbtime, int iWorldID = 0, UINT uiAccountDBID = 0, INT64 biCharDBID = 0); bool IsValid() {return m_bValid;} private: bool m_bValid; }; #endif