#pragma once #define OUTPUT_NONE 0 #define OUTPUT_FILE 1 #define OUTPUT_MONITOR 2 #define OUTPUT_BOTH 3 #define MAX_TIME_SIZE 100 #define __WAVERIX_SUNLOG_REVISION__ // // <±âº» ¼³¸í> // CSunLog Revision // À̰ÍÀº ±âÁ¸ ¹öÀü°úÀÇ È£È¯µÇ¸é¼­ »õ·Î¿î ¿äû»óȲÀ» ¼ö¿ëÇϱâ À§ÇÑ ·ÎÁ÷°ú ±×¿¡ µû¶ó »õ·Î ¼³°èµÈ ¹öÀüÀÌ´Ù. // ¸ðµç ·Î±×ÀÇ ±âº» ÀÎÅÍÆäÀ̽º´Â CSunLog::LOGGINGwithARG À̸ç, // ±âŸ ´Ù¸¥ ¼¼ºÎÀûÀΠ󸮵éÀ» ´ë½ÅÇØÁÖ´Â ÀÎÅÍÆäÀ̽ºµéÀÌ Á¦°øµÈ´Ù. // // <±âÁ¸ ȣȯÀ» À§ÇÑ ·Î±× ·¹º§°ú ·Î±× ¿É¼ÇÀÇ ÀçÁ¤ÀÇ> // LEVELÀÇ °æ¿ì, ÀÚ±â ÀÌÇϸ¦ ¸ðµÎ Æ÷ÇÔÇÑ´Ù. // FULLÀÎ °æ¿ì, { CRITICAL, MIDDLE, FULL } // MIDDLEÀÎ °æ¿ì, { CRITICAL, MIDDLE } // CRITICALÀÎ °æ¿ì, { CRITICAL } // OPTIONÀÇ °æ¿ì, // FILEÀº ÆÄÀÏ¿¡¸¸ ±â·ÏÇÑ´Ù. // CONSOLEÀº Äֿܼ¡¸¸ ±â·ÏÇÑ´Ù. // BOTHÀÎ °æ¿ì, »õ·Ó°Ô ÁÖ¾îÁø ÀÎÀÚ°ª¿¡ ÀǰÅ, ÇØ´ç À§Ä¡¿¡¸¸ ±â·ÏÇÑ´Ù. // -> BOTH·Î ¼³Á¤µÇ¾î ÀÖ´Ù°í ÇÒÁö¶óµµ, ·Î±ë½ÃÁ¡¿¡ ƯÁ¤ ¸Åü¸¸ ¼±ÅÃÇØ¼­ ±â·ÏÀÌ °¡´ÉÇÏ´Ù // CATEGORYÀÇ °æ¿ì, (½Å±Ô) // ÇØ´ç Ç÷¢°ªÀÌ ¼³Á¤µÇ¾î ÀÖ´Â °æ¿ì¿¡¸¸ Çã¿ëÇÑ´Ù. // // <±âÁ¸ ȣȯÀ» À§ÇÑ ÀÎÅÍÆäÀ̽ºµé> // <¸ÅÅ©·Î> SUNLOG : TCHAR±â¹ÝÀÇ ¾à°£ º¯ÇüµÈ ·çƾÀ» ÅëÇØ¼­ 󸮵ȴÙ. // <¸ÅÅ©·Î> SUNLOGCONN, ±âŸ... : SUNLOG¿Í ¸¶Âù°¡ÁöÀ̸ç, ÀÌÈÄ Çϳª·Î ÅëÇÕÇÏ´Â ¹æÇâÀ¸·Î À¯µµµÉ °ÍÀÌ´Ù. // <¸Þ¼Òµå> InsertMessage : SUNLOGxxx¿Í °°Àº ¸ÅÅ©·Î¸¦ »ç¿ëÇÏÁö ¾ÊÀº °æ¿ìµéÀÌ ÀÖÀ¸¸ç, À̸¦ À§ÇÑ Á¦°ø ÀÎÅÍÆäÀ̽º // <Æ÷¸äÁ¦¾î> '\n'ÀÇ Ã³¸®, ÇϳªÀÇ ·Î±ë´ç ´ÙÀ½ÁÙ·Î ³Ñ±â´Â ·çƾÀÌ Æ÷ÇԵǾî ÀÖ´Ù. »ç¿ëÇϴµ¥ ÀÖ¾î ´ÙÀ½ ÁÙ·Î ³Ñ±â´Â // ·çƾÀÇ ¿©ºÎ´Â À־ ¾ø¾îµµ ¾Ë¾Æ¼­ ÇØÁØ´Ù. // // <½Å±Ô ¿É¼ÇÀÇ È°¿ë ¹æ¾È> // ITEM, TRADE µîµîÀÇ °ü·ÃµÈ ¹üÁÖ¸¦ Æ÷ÇÔÇØ ·Î±ëÇÒ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù. // À̵éÀÇ ºí·Ï󸮵µ °¡´ÉÇϸç, ¾²¿©Áø ÆÄÀÏ (SolarLog¸¦ »ç¿ëÇϹǷΠ*.wzl)À» ¿¢¼¿·Î ºÒ·¯ ±¸ºÐÇÒ ¼ö ÀÖ´Ù. // // <½Å±Ô Ä«Å×°í¸® Ãß°¡> // ´ÙÀ½ °Ë»ö ´Ü¾î ""¸¦ SunLog.h, SunLog.cpp¿¡¼­ ã¾Æ º¼ °Í. // Ãß°¡ÇØ¾ß ÇÒ °ÍÀÌ ¹«¾ùÀÎÁö ³ª¿À¸ç, ÇÊ¿äÇÑ °æ¿ì Ãß°¡ÇÒ ¼ö ÀÖ´Ù. // ´Ü, Ä«Å×°í¸®¿¡ ´ëÇÑ Ã³¸® Çã¿ë ¿©ºÎ´Â // BIT fields¿¡ ±âÁØ(CSunLog::cCATE_MASK)Çϸç, °íÁ¤µÈ °ªÀ¸·Î ÀÛµ¿µÇ°í ±× °³¼ö´Â Çö ½Ã½ºÅÛ¿¡¼­´Â 32°³°¡ ÇѰèÀÏ °ÍÀÌ´Ù. // // <ÀÌÈÄ ÀÛ¾÷ÇÒ ÀÏ> // Ä«Å×°í¸®ÀÇ µ¿Àû ¼³Á¤ ¶Ç´Â ... // GuildServerÂÊÀº ÀÛ¾÷µÇÁö ¾Ê¾Ò´Ù. // Blah~ Blah~ VC++ Compiler´Â ¾Æ·¡ÀÇ ±¸¹®¿¡¼­ ½ÇÆÐ°¡ µÇ¾ú´Ù. »ç¿ëÇÏÁö ¾Ê´Â´Ù. #define SUNLOG_ENUM_TO_STRING(name) ((TCHAR*)CSunLog::s##name()) #define ENUM_VALUE_LOGLEVEL(type, name, value) \ static const type c##name = (eLOGLEVEL)(value); // static const DWORD sc##name = (DWORD)(__int64)_T(#name) //static const TCHAR* #define ENUM_VALUE_LOGOPTION(type, name, value) \ static const type c##name = (eLOGOPTION)(value); // static const DWORD sc##name = (DWORD)(__int64)_T(#name) #define ENUM_VALUE_CATEGORY(type, name, value) \ static const type c##name = (eLOGCATEGORY)(value); \ inline static TCHAR* sc##name() { return _T(#name); } // static const DWORD sc##name = (DWORD)(__int64)_T(#name) // #define SUNLOG_LOGGER_PER_OPTION(where, option) \ inline BOOL LOG( const eLOGLEVEL logLEVEL, const eLOGCATEGORY category, const TCHAR* pszMsg, va_list args )\ { \ CSunLog* pSunLog = CONTAINING_RECORD(this, CSunLog, where); \ BOOL bRET = LOGGINGwithARG( pSunLog, option, logLEVEL, category, pszMsg, args ); \ va_end(args); \ return bRET; \ } // #define SUNLOG_LOGGER_PER_LEVEL(where, option, level) \ inline BOOL LOG( const eLOGCATEGORY category, const TCHAR* pszMsg, va_list args ) \ { \ CSunLog* pSunLog = CONTAINING_RECORD(this, CSunLog, where); \ BOOL bRET = LOGGINGwithARG( pSunLog, option, level, category, pszMsg, args ); \ va_end(args); \ return bRET; \ } // #define SUNLOG_CATEGORY_OPTION_INTERFACE(name, catename) \ inline BOOL name( const eLOGLEVEL logLEVEL, const TCHAR* pszMsg, ... ) \ { \ va_list args; \ va_start(args, pszMsg); \ return LOG( logLEVEL, catename, pszMsg, args ); \ } // #define SUNLOG_CATEGORY_LEVEL_INTERFACE(name, catename) \ inline BOOL name( const TCHAR* pszMsg, ... ) \ { \ va_list args; \ va_start(args, pszMsg); \ return LOG( catename, pszMsg, args ); \ } class SolarLog; class CSunLog { public: // // // eLOGLEVELÀº SunServer.ini¿¡ µî·ÏµÈ LOG_LEVELÀÇ ¼öÄ¡°ª°ú µ¿ÀÏÇÏ´Ù. // 1<= (value) <=3 enum eLOGLEVEL {}; // // eLOGOPTIONÀº SunServer.ini¿¡ µî·ÏµÈ LOG_OPTIONÀÇ ¼öÄ¡°ª°ú µ¿ÀÏÇÏ´Ù. // 1<= (value) <=3 enum eLOGOPTION {}; // // eLOGCATEGORY´Â ½Å±Ô Ãß°¡µÈ °ÍÀ¸·Î ³²±â´Â ·Î±×ÀÇ ¼º°ÝÀ» ºÐ·ùÇϱâ À§ÇÔÀÌ´Ù. // ÆÄÀÏ·Î ³²´Â ·Î±×¿¡´Â ÀÌ ¹üÁÖ·Î ±¸ºÐÇÒ ¼ö ÀÖµµ·Ï ÅÇÀÌ ±¸ºÐµÈ´Ù. // InitÀ» ÅëÇØ ÀÌ ¹üÁֵ鿡 ´ëÇÑ ¸¶½ºÅ©¸¦ ¾º¿ï ¼ö ÀÖÀ» °ÍÀ̳ª, Ưº°ÇÑ ÅøÀº Á¦°øµÇÁö ¾Ê´À´Ù. // Bits 1<= (value) <=16 enum eLOGCATEGORY {}; enum eLOGCATEGORYGROUP {}; ENUM_VALUE_LOGOPTION(eLOGOPTION, OUTPUT_NONE, OUTPUT_NONE); ENUM_VALUE_LOGOPTION(eLOGOPTION, OUTPUT_FILE, OUTPUT_FILE); ENUM_VALUE_LOGOPTION(eLOGOPTION, OUTPUT_CONSOLE, OUTPUT_MONITOR); ENUM_VALUE_LOGOPTION(eLOGOPTION, OUTPUT_BOTH, OUTPUT_BOTH); ENUM_VALUE_LOGOPTION(eLOGOPTION, OUTPUT_MASK, cOUTPUT_NONE|cOUTPUT_FILE|cOUTPUT_CONSOLE); ENUM_VALUE_LOGLEVEL(eLOGLEVEL, CRITICAL_LOG, eCRITICAL_LOG); ENUM_VALUE_LOGLEVEL(eLOGLEVEL, MIDDLE_LOG, eMIDDLE_LOG); ENUM_VALUE_LOGLEVEL(eLOGLEVEL, FULL_LOG, eFULL_LOG); ENUM_VALUE_LOGLEVEL(eLOGLEVEL, DEV_LOG, eDEV_LOG); ENUM_VALUE_LOGLEVEL(eLOGLEVEL, LEVEL_MASK, cCRITICAL_LOG|cMIDDLE_LOG|cFULL_LOG|cDEV_LOG); // ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_DEFAULT, 1<<0); ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_CONNECTION, 1<<1); ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_WAREHOUSE, 1<<2); ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_TRADE, 1<<3); ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_ITEM, 1<<4); ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_MISSION, 1<<5); ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_ABUSE, 1<<6); ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_DATARELOAD, 1<<30); // ENUM_VALUE_CATEGORY(eLOGCATEGORY, CATE_MASK, \ cCATE_DEFAULT | cCATE_CONNECTION | cCATE_WAREHOUSE | cCATE_TRADE | cCATE_ITEM | cCATE_MISSION \ | cCATE_DATARELOAD | cCATE_ABUSE ); CSunLog( VOID ); ~CSunLog( VOID ); public: //WriteMessage // virtual BOOL Init( const BYTE byLogOption, const BYTE byLogLevel, const TCHAR* pszFilePath, const TCHAR* pszFileName, BOOL bUseSolarLog = TRUE ); inline static BOOL LOGGING( CSunLog* pSunLog, const eLOGOPTION logOpt, const eLOGLEVEL logLEVEL, const eLOGCATEGORY category, const TCHAR* pszMsg ) { return LOGGINGwithARG( pSunLog, logOpt, logLEVEL, category, pszMsg, (va_list)NULL ); } static BOOL LOGGINGwithARG( CSunLog* pSunLog, const eLOGOPTION logOpt, const eLOGLEVEL logLEVEL, const eLOGCATEGORY category, const TCHAR* pszMsg, va_list vlist ); // ÀÌÀü ¹öÀü ȣȯ¿ë inline bool InsertMessage( TCHAR* pszMsg, BYTE byLogLevel = 3 ) { return TRUE == LOGGING( this, CSunLog::cOUTPUT_BOTH, (eLOGLEVEL)byLogLevel, CSunLog::cCATE_DEFAULT, pszMsg ); } // Reload VOID SetLogLevel( BYTE lv ); // // ¸Å ÇÁ·¹Àӽÿ¡ ¼­¹ö ½Ã°£ º¯°æ °Ë»ç¸¦ ¼öÇàÇÑ´Ù. // 1) ¹öÆÛ ŸÀӾƿô üũ // 2) ³¯Â¥ º¯°æ¿¡ µû¸¥ ¹®Á¦, ³²¾ÆÀÖ´Â ¹öÆÛ ºñ¿ì±â µîÀÇ Ã³¸®¸¦ ¼öÇàÇÑ´Ù. // 2-1) À̰æ¿ì, ÆÄÀÏÀÌ º¯°æµÇ´Â °æ¿ìÀÇ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ÆÄÀÏÀÇ °æ¿ì´Â ¹Ì¸® Flush¸¦ ¼öÇàÇϵµ·Ï ÇÑ´Ù. VOID Update(); // // ÇöÀç Àӽà ¹öÆÛ¿¡ ¾²¿©Áø ³»¿ëÀ» °­Á¦·Î Ãâ·Â½ÃŲ´Ù. (ÄܼÖ+ÆÄÀÏ) VOID Flush( eLOGOPTION eLogOPT = CSunLog::cOUTPUT_BOTH ); typedef BOOL (*WriteMessage)( const CSunLog* pSunLog, const TCHAR* pMsg, va_list arglist ); VOID RegisterHandler( WriteMessage fnFileLogger ); // // // //====================================================================================================== // ´ÙÀ½ºÎÅÍ´Â CSunLog°´Ã¼¿¡¼­ »ç¿ëÇÏ´Â º°µµÀÇ Ã³¸®·ÎÁ÷µéÀ̸ç, À̰ÍÀ» »ç¿ëÇϱâ À§ÇÑ INTERFACE°¡ ¾Æ´Ï´Ù. // »ç¿ëÇÏÁö ¸»°Í. // protected: // static const DWORD c_FileLogDataSize = 1024*3; // 3KB static const DWORD c_FileLogDataSizeLimit = 1024*2; // 2KB static const DWORD c_ConsoleLogDataSize = 1024*8; // 8KB static const DWORD c_ConsoleLogDataSizeLimit = 1024*7; // 7KB static const DWORD c_ConsoleLogInterval = 500; // 500ms static const DWORD c_FileLogInterval = 5000; // 5000ms struct sLOG_HANDLER { WriteMessage fn_FILE_LOGGER; WriteMessage fn_CONSOLE_LOGGER; }; public: class CSunLogInfo { public: HANDLE m_hConsole; //sLOG_HANDLER m_Handler; WriteMessage m_fnCONSOLE_LOGGER; struct sLOGGING_INFO { eLOGOPTION Option; eLOGLEVEL Level; eLOGCATEGORY Mask; } LOGGING_INFO; struct sCONSOLE_LOG { DWORD Written; TCHAR* QueuedStream; // Aligned Buffer by c_ConsoleLogDataSize } CONSOLE_LOG; CRITICAL_SECTION m_csConsoleLog; DWORD m_dwConsoleTimeout; CSunLogInfo(); ~CSunLogInfo(); }; // ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡ Çϳª¸¸ À¯ÁöÇØ¾ßÇÏ´Â SUNLOG Á¤º¸µé static DWORD g_dwSUNLOG_INIT; static CSunLogInfo* g_pSUNLOG; private: // // ±â´É ÇÊÅ͸µ #ifdef __SUNLOG_UNUSED_SECT // // // buffer <- CSunLog::m_strFileNameWithTime // size <- sizeof(CSunLog::m_strFileNameWithTime) TCHAR* GetCurrentFileNameWithTime( const TCHAR* defFileName ); #endif // // LEVELÀÇ °æ¿ì, ÀÚ±â ÀÌÇϸ¦ ¸ðµÎ Æ÷ÇÔÇÑ´Ù. // FULLÀÎ °æ¿ì, CRITICAL+MIDDLE+FULL // MIDDLEÀÎ °æ¿ì, CRITICAL+MIDDLE // CRITICALÀÎ °æ¿ì, CRITICAL // OPTIONÀÇ °æ¿ì, // FILEÀº ÆÄÀÏ¿¡¸¸ ±â·ÏÇÑ´Ù. // CONSOLEÀº Äֿܼ¡¸¸ ±â·ÏÇÑ´Ù. // BOTHÀÎ °æ¿ì, »õ·Ó°Ô ÁÖ¾îÁø ÀÎÀÚ°ª¿¡ ÀǰÅ, ÇØ´ç À§Ä¡¿¡¸¸ ±â·ÏÇÑ´Ù. // CATEGORYÀÇ °æ¿ì, // ÇØ´ç Ç÷¢°ªÀÌ ¼³Á¤µÇ¾î ÀÖ´Â °æ¿ì¿¡¸¸ Çã¿ëÇÑ´Ù. BOOL CheckControl( const CSunLogInfo::sLOGGING_INFO* pINFO, const eLOGLEVEL logLEVEL, const eLOGOPTION logOPT, const eLOGCATEGORY logCATE ) { __UNUSED(logOPT); if( pINFO->Level < logLEVEL ) return FALSE; if( (pINFO->Mask&logCATE) != logCATE ) return FALSE; return TRUE; } //BOOL CheckHandler( CSunLog::sLOG_HANDLER& logHandler ); BOOL CheckHandler( WriteMessage& pfnColsoleLogHandler, WriteMessage& pfnFileLogHandler ); private: enum ePREFIX { PREFIX_NONE=0, PREFIX_WRITE_TIME=1, PREFIX_CATEGORY=2, }; // METHODs for Handler // // written position : INT (0.ret SolarLog* m_pMainLogger; WriteMessage m_fnFILE_LOGGER; struct sFILE_LOG { DWORD Written; TCHAR* QueuedStream; // Aligned Buffer by c_FileLogDataSize } FILE_LOG; CRITICAL_SECTION m_csFileLog; DWORD m_dwFileTimeout; public: sFILE_LOG& GetFILE_LOG() { return FILE_LOG; } //DWORD m_dwWrittenFile; //TCHAR* m_pFileQueuedData; // Aligned Buffer by c_FileLogDataSize //DWORD m_dwWrittenConsole; //TCHAR* m_pConsoleQueuedData; // Aligned Buffer by c_ConsoleLogDataSize //·Î±× »ðÀÔ Áï½Ã Ãâ·Â Ç÷¯±×. private: BOOL m_bFileOutDelay; public: VOID SetFileOutDelayOption( BOOL bDelay ){ m_bFileOutDelay = bDelay; } }; #include //#include