28 #ifndef __TOPOLOGY_LOG_H__ 29 #define __TOPOLOGY_LOG_H__ 37 inline std::string NowTime();
39 enum TLogLevel {logERROR, logWARNING, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4};
47 std::ostringstream& Get(TLogLevel level = logINFO);
50 static TLogLevel& ReportingLevel();
51 static std::string ToString(TLogLevel level);
52 static TLogLevel FromString(
const std::string& level);
54 std::ostringstream os;
57 Log& operator =(
const Log&);
66 std::ostringstream& Log<T>::Get(TLogLevel level)
68 os <<
"- " << NowTime();
69 os <<
" " << ToString(level) <<
": ";
70 os << std::string(level > logDEBUG ? level - logDEBUG : 0,
'\t');
87 TLogLevel& Log<T>::ReportingLevel()
89 static TLogLevel reportingLevel = logDEBUG4;
90 return reportingLevel;
94 std::string Log<T>::ToString(TLogLevel level)
96 static const char*
const buffer[] = {
"ERROR",
"WARNING",
"INFO",
"DEBUG",
"DEBUG1",
"DEBUG2",
"DEBUG3",
"DEBUG4"};
100 template <
typename T>
101 TLogLevel Log<T>::FromString(
const std::string& level)
103 if (level ==
"DEBUG4")
105 if (level ==
"DEBUG3")
107 if (level ==
"DEBUG2")
109 if (level ==
"DEBUG1")
111 if (level ==
"DEBUG")
115 if (level ==
"WARNING")
117 if (level ==
"ERROR")
119 Log<T>().Get(logWARNING) <<
"Unknown logging level '" << level <<
"'. Using INFO level as default.";
126 static FILE*& Stream();
127 static void Output(
const std::string& msg);
130 inline FILE*& Output2FILE::Stream()
132 static FILE* pStream = stderr;
136 inline void Output2FILE::Output(
const std::string& msg)
138 FILE* pStream = Stream();
141 fprintf(pStream,
"%s", msg.c_str());
145 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) 146 # if defined (BUILDING_FILELOG_DLL) 147 # define FILELOG_DECLSPEC __declspec (dllexport) 148 # elif defined (USING_FILELOG_DLL) 149 # define FILELOG_DECLSPEC __declspec (dllimport) 151 # define FILELOG_DECLSPEC 152 # endif // BUILDING_DBSIMPLE_DLL 154 # define FILELOG_DECLSPEC 157 class FILELOG_DECLSPEC FILELog :
public Log<Output2FILE> {};
160 #ifndef FILELOG_MAX_LEVEL 161 #define FILELOG_MAX_LEVEL logDEBUG4 164 #define FILE_LOG(level) \ 165 if (level > FILELOG_MAX_LEVEL) ;\ 166 else if (level > FILELog::ReportingLevel() || !Output2FILE::Stream()) ; \ 167 else FILELog().Get(level) 169 #define FLUSH_LOG(level) \ 170 if (level > FILELOG_MAX_LEVEL) ;\ 171 else if (level > FILELog::ReportingLevel() || !Output2FILE::Stream()) ; \ 172 else FILELog().flush() 174 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) 178 inline std::string NowTime()
180 const int MAX_LEN = 200;
181 char buffer[MAX_LEN];
182 if (GetTimeFormatA(LOCALE_USER_DEFAULT, 0, 0,
183 "HH':'mm':'ss", buffer, MAX_LEN) == 0)
184 return "Error in NowTime()";
186 static DWORD first = GetTickCount();
187 std::stringstream result;
188 result << buffer <<
"." << std::setfill(
'0') << std::setw(3) << ((long)(GetTickCount() - first) % 1000);
194 #include <sys/time.h> 196 inline std::string NowTime()
202 strftime(buffer,
sizeof(buffer),
"%X", localtime_r(&t, &r));
204 gettimeofday(&tv, 0);
205 std::stringstream result;
206 result << buffer <<
"." << std::setfill(
'0') << std::setw(3) << ((long)tv.tv_usec / 1000);
212 #endif //__TOPOLOGY_LOG_H__ libtopology: Extensions for topology preservation for libcola and libavoid libraries.
Definition: shape.h:41