/*************************************************************************** Logger.h ----------------------------------------- begin : 2011/10/26 copyright : (C) 2005 SolutionBox Inc. author : Service 1 Team email : svc1@solbox.com version : 3.2.0.805 CopyRight(C) 2005 SolutionBox Inc. All Rights reserved. Redistribution and use in source and binary forms, with or with out modification, are not permitted in outside of SolutionBox Inc. ***************************************************************************/ #ifndef __LOGGER_H__ #define __LOGGER_H__ #include #include #include ///@brief ·Î±× ·¹º§ Á¤ÀÇ #define LEMR 0 /* system is or will be unusable if situation is not resolved */ #define LALT 1 /* immediate action required */ #define LCRT 2 /* critical situations */ #define LERR 3 /* error conditions */ #define LWAR 4 /* recoverable errors */ #define LNOT 5 /* unusual situation that merits investigation */ #define LINF 6 /* information messages */ #define LDBG 7 /* verbose data for debugging */ #define LDEV 8 /* verbose data for developer */ #define LDEV1 9 /* start or end the function of application level */ #define LDEV2 10 /* start or end the function of application level */ #define MAX_LOG_LEVEL LDEV2 ///@brief Log Á¤º¸¸¦ ÆÄÀÏ·Î ÀúÀåÇϱâ À§ÇÑ Class. ///1. °¡º¯ format À¸·Î Àü´ÞµÈ ·Î±× °ü·Ã Á¤º¸¸¦ Log Level ¿¡ µû¶ó ·Î±× ÆÄÀÏ¿¡ ¾Æ·¡ÀÇ 4°¡Áö Çü½ÄÀ¸·Î ÀúÀåÇÑ´Ù. /// /// 1.1 Prefix·Î [hh:mm:ss]¿Í [ClassName::FunctionName]ÀÌ Ãß°¡µÈ ·Î±× /// LOG( level, format, ... ) ¸ÅÅ©·Î »ç¿ë. /// ¿¹) [17:43:40] [DBG] log level debug [LoggerTestTestLogger] /// /// 1.2 Prefix·Î [hh:mm:ss]ÀÌ Ãß°¡µÈ ·Î±× /// _LOG( level, format, ... ) ¸ÅÅ©·Î »ç¿ë /// ¿¹) [17:43:40] [EMR] log level emergency /// /// 1.3 Prefix°¡ ¾ø´Â ·Î±× /// _LOG_( level, format, ... ) ¸ÅÅ©·Î »ç¿ë /// ¿¹) log level emergency /// /// 1.4 Hex ·Î±×. /// LOG_HEX( level, data, size ) ¸ÅÅ©·Î »ç¿ë /// ¿¹) 00010203 04050607 08090A0B 0C0D0E0F /// ///2. Logger °´Ã¼ ÃʱâÈ­½Ã Àü´ÞµÈ Log Level Á¤º¸º¸´Ù Àü´Þ¹ÞÀº Log Level Á¤º¸°¡ Å« °æ¿ì ÇØ´ç ·Î±×´Â ÆÄÀÏ·Î ÀúÀåµÇÁö ¾Ê´Â´Ù. /// ///3. ·Î±× ÆÄÀÏÀº ¸Å ÀÏ´ÜÀ§·Î ÀúÀåÆÄÀÏÀÌ º¯°æµÈ´Ù. /// ///4. ·Î±× ÀúÀåÀ» À§ÇÑ program °æ·Î°¡ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì ÀÚµ¿ »ý¼º 󸮵ȴÙ. /// ///5. ·Î±× ÀúÀ广½ÄÀº ¸Å ÀúÀå·Î±×¸¶´Ù open-close ·Î 󸮵ȴÙ. /// ///6. ÆÄÀÏ·Î ±â·Ï½Ã Log Level ¿¡ ´ëÇÑ Á¤º¸µµ ÇÔ²² ±â·ÏµÈ´Ù. /// ///7. ½Ì±ÛÅæÀ¸·Î ÀÛ¼ºµÇ¾ú°í, CLogger::Init(...)½Ã¿¡ ¾²·¹µå ¾ÈÁ¤¼ºÀ» Á¦°øÇÑ´Ù. /// ///8. µ¿ÀûÀ¸·Î ·Î±× ·¹º§À» º¯°æÇÒ ¼ö ÀÖ´Â ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. /// class CLogger { // Attributes private: ///@brief ½Ì±ÛÅæ °´Ã¼ ÀÎÆ®ÅϽº. static CLogger* m_pInstance; ///@brief ½Ì±ÛÅæ °´Ã¼ ÃʱâÈ­ ¿©ºÎ. static bool m_bIsInitialized; ///@brief ½Ì±ÛÅæ °´Ã¼ ÃʱâÈ­½Ã ½º·¹µå ¾ÈÁ¤¼ºÀ» À§ÇÑ ¹ÂÅØ½º. static pthread_mutex_t m_mutex; ///@brief ÇÁ·Î±×·¥ À̸§. ·Î±× ÆÄÀÏ °æ·Î¸¦ ¸¸µé ¶§ »ç¿ë. std::string m_szProgramName; ///@brief °øÅë ·Î±× µð·ºÅ丮 À̸§. ·Î±× ÆÄÀÏ °æ·Î¸¦ ¸¸µé ¶§ »ç¿ë. std::string m_szLogDir; ///@brief ·Î±× ·¹º§. int m_nLogLevel; ///@brief ·Î±× ·¹º§¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¿­ Á¤º¸¸¦ ÀúÀå. std::vector m_vectorLogLevelString; protected: public: ///@brief ·Î±× Çü½ÄÀ» ÁöÁ¤. typedef enum { PREFIX_NONE = 0, /// Ŭ·¡½º ¼³¸íÀÇ 1.3¿¡ ÇØ´ç PREFIX_DATE, /// Ŭ·¡½º ¼³¸íÀÇ 1.2¿¡ ÇØ´ç PREFIX_FUNCTION, /// Ŭ·¡½º ¼³¸íÀÇ 1.1¿¡ ÇØ´ç } LOG_PREFIX; // Operations private: ///@brief »ý¼ºÀÚ. /// ÇÁ·Î±×·¥ À̸§, °øÅë ·Î±× µð·ºÅ丮, ·Î±× ·¹º§À» ÀúÀåÇϰí /// ·Î±× ·¹º§¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¿­ Á¤º¸¸¦ ¸¸µç´Ù. ///@param programName [in] ÇÁ·Î±×·¥ À̸§ ///@param logDir [in] °øÅë ·Î±× µð·ºÅ丮 °æ·Î ///@param logLevel [in] ·Î±× ·¹º§ CLogger( std::string programName, std::string logDir, int logLevel ); ///@brief ¼Ò¸êÀÚ. /// ·Î±× ·¹º§¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¿­ Á¤º¸¸¦ ÀúÀåÇϰí ÀÖ´Â /// º¤ÅÍ m_vectorLogLevelStringÀ» clear ½ÃÅ´. virtual ~CLogger(); ///@brief ·Î±× ·¹º§¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¿­À» ¸¸µç´Ù. ///@param none. ///@return none. void MakeLogLevelString(); ///@brief ·Î±× ÆÄÀÏÀÌ À§Ä¡ÇÒ ½ÇÁ¦ ·Î±× µð·ºÅ丮¸¦ »ý¼ºÇÑ´Ù. /// »ý¼ºÇÒ µð·ºÅ丮 °æ·Î´Â 'logDir/programName'ÀÌ µÈ´Ù. ///@param programName [in] ÇÁ·Î±×·¥ À̸§ ///@param logDir [in] °øÅë ·Î±× µð·ºÅ丮 °æ·Î ///@return µð·ºÅ丮°¡ ÀÌ¹Ì Á¸ÀçÇϰųª »ý¼º ¼º°øÇϸé true, /// ÇØ´ç °æ·Î°¡ Á¸ÀçÇÏÁö¸¸ µð·ºÅ丮°¡ ¾Æ´Ï°Å³ª, µð·ºÅ丮 »ý¼º ½ÇÆÐÇϸé false ¹Ýȯ. static bool MakeLogDir( std::string programName, std::string logDir ); ///@brief ÇØ´ç °æ·Î°¡ µð·ºÅ丮 ÀÎÁö ¾Æ´ÑÁö ÆÇ´Ü. ///@param path [in] µð·ºÅ丮 ÀÎÁö ¾Æ´ÑÁö ÆÇ´ÜÇÒ °æ·Î. ///@return ÇØ´ç °æ·Î°¡ µð·ºÅäÀ̸é true, /// °æ·Î°¡ Á¸ÀçÇÏÁö ¾Ê°Å³ª µð·ºÅ丮°¡ ¾Æ´Ï¸é false ¹Ýȯ. static bool IsDirectory( std::string path ); ///@brief ·Î±× ·¹º§ÀÌ ¿Ã¹Ù¸¥Áö ÆÇº°. ///@param logLevel [in] ///@return ¿Ã¹Ù¸¥ ·Î±× ·¹º§À̸é true, ±×·¸Áö ¾ÊÀ¸¸é false ¹Ýȯ. static bool IsValidLogLevel( int logLevel ); ///@brief ½Ã°£ Á¤º¸¸¦ ÀÔ·Â ¹Þ¾Æ ·Î±× ÆÄÀÏ À̸§À» ¸¸µç´Ù. /// ·Î±× ÆÄÀÏ À̸§ Çü½Ä : ÇÁ·Î±×·¥¸í_YYYYMMDD.log ///param timeNow [in] ÇöÀç ½Ã°£ Á¤º¸. ///return ·Î±× ÆÄÀÏ À̸§. std::string GetLogFilename( struct tm &timeNow ); ///@brief ·Î±×¸¦ ³²±â´Â´Â Ŭ·¡½º°¡ Á¤ÀÇµÈ ÆÄÀÏÀÇ À̸§¿¡¼­ Ŭ·¡½º¸íÀ» ÃßÃâÇÑ´Ù. /// ¾²·¹µå ¾ÈÁ¤¼ºÀ» º¸ÀåÇÑ´Ù. ///@param className [out] ÆÄÀÏ À̸§¿¡¼­ ÃßÃâµÈ Ŭ·¡½º¸í ///@param filename [in] ÆÄÀÏ À̸§. ///@return Ŭ·¡½º¸í ÃßÃâÀÌ ¼º°øÇϸé Ŭ·¡½º¸í ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅÍ, ÃßÃâ ½ÇÆÐÇϸé NULL. const char* GetClassName( char* className, const char* filename ); ///@brief ÀÎÀÚ logPrefix¿¡ µû¶ó ÀûÀýÇÑ Çü½ÄÀ¸·Î ·Î±× ÆÄÀÏ¿¡ ·Î±×¸¦ ÀúÀåÇÑ´Ù. /// ÀÎÀÚ logLevelÀÌ ¼³Á¤µÈ ·Î±× ·¹º§º¸´Ù ³ôÀ¸¸é ·Î±×¸¦ Ãâ·ÂÇÏÁö ¾Ê´Â´Ù. ///@param logLevel [in] ·Î±× ·¹º§ ///@param logPrefix [in] ·Î±× ÇÁ¸®ÇȽº Á¾·ù. ///@functionName [in] ClassName::FunctionNmae() Çü½ÄÀÇ ¹®ÀÚ¿­. ///@lineNum [in] ¶óÀÎ ¹øÈ£. ///@log [in] Ãâ·ÂÇϰíÀÚ ÇÏ´Â ·Î±× ³»¿ë. bool Write( int logLevel, int logPrefix, const char* functionName, int lineNum, const char* log ); protected: public: ///@brief ½Ì±ÛÅæ °´Ã¼ m_pInstance¸¦ »ý¼ºÇϰí ÀÎÀÚ Á¤º¸·Î ·Î±× µð·ºÅ丮¸¦ ¸¸µç´Ù. ///@param programName [in] ÇÁ·Î±×·¥ À̸§ ///@param logDir [in] °øÅë ·Î±× µð·ºÅ丮 °æ·Î ///@param logLevel [in] ·Î±× ·¹º§ ///@return ·Î±× µð·ºÅ丮¸¦ ¸¸µé°í ½Ì±ÛÅæ °´Ã¼¸¦ »ý¼ºÇßÀ¸¸é true, /// ·Î±× µð·ºÅ丮¸¦ ¸¸µéÁö ¸ø Ç߰ųª ÀÎÀÚ °ªÀÌ ¿Ã¹Ù¸£Áö ¾ÊÀ¸¸é false ¹Ýȯ. static bool Init( std::string programName, std::string logDir, int logLevel ); ///@brief ½Ì±ÛÅæ °´Ã¼ m_pInstance¸¦ delete ÇÑ´Ù. ///@param none. ///@return none. static void Exit(); ///@brief ½Ì±ÛÅæ °´Ã¼ m_pInstance¸¦ ¹ÝȯÇÑ´Ù. ///@param none. ///@return CLogger °´Ã¼ÀÇ ÀνºÅϽº. static CLogger* GetInstance(); ///@brief Prefix·Î [hh:mm:ss]ÀÌ Ãß°¡µÈ Çü½ÄÀ¸·Î ·Î±× ÀúÀå. ///@param logLevel [in] ·Î±× ·¹º§ ///@param fmt [in] ·Î±× ³»¿ë Æ÷¸Ë. ///@param __VAR_ARGS__ [in] °¡º¯ ÀÎÀÚ. ///@return ·Î±× ÆÄÀÏ¿¡ ·Î±×¸¦ ÀúÀåÇßÀ¸¸é true, ±×·¸Áö ¾ÊÀ¸¸é false ¹Ýȯ bool Write( int logLevel, const char * fmt, ...) __attribute__((format(printf, 3, 4))); ///@brief Prefix°¡ ¾ø´Â ·Î±× ÀúÀå. ///@param logLevel [in] ·Î±× ·¹º§ ///@param fmt [in] ·Î±× ³»¿ë Æ÷¸Ë. ///@param __VAR_ARGS__ [in] °¡º¯ ÀÎÀÚ. ///@return ·Î±× ÆÄÀÏ¿¡ ·Î±×¸¦ ÀúÀåÇßÀ¸¸é true, ±×·¸Áö ¾ÊÀ¸¸é false ¹Ýȯ bool WriteNoPrefix( int logLevel, const char * fmt, ...) __attribute__((format(printf, 3, 4))); // CHG 2012-08-16 huibong // °¡º¯ÀÎÀÚ¸¦ »ç¿ëÇÏ´Â Write ÇÔ¼ö ´ÙÁß Á¤ÀÇ·Î ÀÎÇØ... // Complier ¿¡¼­ Àμö °¹¼ö ¹× Type ÀÌ µ¿ÀÏÇÒ °æ¿ì ´Ù¸¥ ÇÔ¼ö¸¦ °¡¸£Å°´Â Çö»óÀÌ ¹ß°ßµÊ. // À̸¦ ÇØ°áÇϱâ À§ÇØ Write ÇÔ¼ö¿¡ ´ëÇÑ ´ÙÁß Á¤ÀǸ¦ Á¦°ÅÅä·Ï ÇÔ¼ö¸íÀ» ¸íÈ®ÇÏ°Ô º¯°æÃ³¸®ÇÔ. ///@brief Prefix·Î [hh:mm:ss]¿Í [ClassName::FunctionName:line]ÀÌ Ãß°¡µÈ Çü½ÄÀ¸·Î ·Î±× ÀúÀå. ///@param logLevel [in] ·Î±× ·¹º§ ///@param filename [in] ÆÄÀÏ À̸§ ///@param funcname [in] ÇÔ¼ö À̸§ ///@param lineNum [in] ¶óÀÎ ¹øÈ£ ///@param fmt [in] ·Î±× ³»¿ë Æ÷¸Ë. ///@param __VAR_ARGS__ [in] °¡º¯ ÀÎÀÚ. ///@return ·Î±× ÆÄÀÏ¿¡ ·Î±×¸¦ ÀúÀåÇßÀ¸¸é true, ±×·¸Áö ¾ÊÀ¸¸é false ¹Ýȯ bool WriteWithFunc( int logLevel, const char* filename, const char* funcname, int lineNum, const char * fmt, ...) __attribute__((format(printf, 6, 7))); ///@brief ·Î±×¸¦ hex Çü½ÄÀ¸·Î ÀúÀå. ///@param logLevel [in] ·Î±× ·¹º§ ///@param data [in] hex Çü½ÄÀ¸·Î Ãâ·ÂÇÒ µ¥ÀÌÅÍ. ///@pram size [in] dataÀÇ Å©±â. ///@return ·Î±× ÆÄÀÏ¿¡ ·Î±×¸¦ ÀúÀåÇßÀ¸¸é true, ±×·¸Áö ¾ÊÀ¸¸é false ¹Ýȯ bool WriteHex( int logLevel, const unsigned char* data, const int size ); ///@brief ·Î±×À» ¼³Á¤ÇÑ´Ù. ÀÎÀÚ logLevelÀÌ ÀûÀýÇÑ °ªÀÌ¸é »õ·Î¿î °ªÀ¸·Î º¯°æÇϰí /// ÀûÀýÇÑ °ªÀÌ ¾Æ´Ï¸é ·Î±× ·¹º§À» º¯°æÇÏÁö ¾Ê´Â´Ù. ///@param logLevel [in] ¼³Á¤ÇÒ ·Î±× ·¹º§ ///@return none. bool SetLogLevel( int logLevel ); inline int GetLogLevel() { return m_nLogLevel; }; inline std::string GetLogDir() { return m_szLogDir + "/" + m_szProgramName; }; }; #define LOG( level, format, ... ) \ if( CLogger::GetInstance() != NULL ) \ { \ CLogger::GetInstance()->WriteWithFunc( level, __FILE__, __FUNCTION__, __LINE__, format, ##__VA_ARGS__ ); \ } #define _LOG( level, format, ... ) \ if( CLogger::GetInstance() != NULL ) \ { \ CLogger::GetInstance()->Write( level, format, ##__VA_ARGS__ ); \ } #define _LOG_( level, format, ... ) \ if( CLogger::GetInstance() != NULL ) \ { \ CLogger::GetInstance()->WriteNoPrefix( level, format, ##__VA_ARGS__ ); \ } #define _LOG_HEX_( level, data, size ) \ if( CLogger::GetInstance() != NULL ) \ { \ CLogger::GetInstance()->WriteHex( level, (const unsigned char*)data, size ); \ } #define FUNC_BEGIN() LOG( LDEV1, "begin" ) #define FUNC_END() LOG( LDEV1, "end" ) #define FRM_BEGIN() LOG( LDEV2, "begin" ) #define FRM_END() LOG( LDEV2, "end" ) #endif // __LOGGER_H__