FirteX-高性能全文索引和检索平台API Documentation |
00001 // 00002 // Copyright(C) 2005--2006 Institute of Computing Tech, Chinese Academy of Sciences. 00003 // All rights reserved. 00004 // This file is part of FirteX (www.firtex.org) 00005 // 00006 // Use of the FirteX is subject to the terms of the software license set forth in 00007 // the LICENSE file included with this software, and also available at 00008 // http://www.firtex.org/license.html 00009 // 00010 // Author : 郭瑞杰(GuoRuijie) 00011 // Email : ruijieguo@software.ict.ac.cn,ruijieguo@gmail.com 00012 // Created : 2006/5/6 00013 // 00014 #ifndef _LOGGER_H 00015 #define _LOGGER_H 00016 00017 #include "StdHeader.h" 00018 #include <ostream> 00019 #include <fstream> 00020 #include <iosfwd> 00021 00022 #ifdef _UNICODE 00023 #define tstreambuf std::wstreambuf 00024 #define tostream std::wostream 00025 #else 00026 #define tstreambuf std::streambuf 00027 #define tostream std::ostream 00028 #endif 00029 00030 namespace firtex 00031 { 00032 namespace utility 00033 { 00035 //log_delegater 00036 template<class CharT> 00037 class log_delegater 00038 { 00039 public: 00040 log_delegater(){} 00041 ~log_delegater(){} 00042 public: 00043 virtual void log(const CharT* text)=0; 00044 }; 00045 00046 #ifdef _UNICODE 00047 typedef log_delegater<wchar_t> tlog_delegater; 00048 #else 00049 typedef log_delegater<char> tlog_delegater; 00050 #endif 00051 00052 00054 //basic_logbuf 00055 template <class CharT, class TraitsT = std::char_traits<CharT> > 00056 class basic_logbuf : 00057 public std::basic_stringbuf<CharT, TraitsT> 00058 { 00059 public: 00060 basic_logbuf():std::basic_stringbuf<CharT, TraitsT>(),m_delegater(NULL) 00061 { 00062 } 00063 basic_logbuf(log_delegater<CharT>* delegater):m_delegater(delegater) 00064 { 00065 } 00066 virtual ~basic_logbuf() 00067 { 00068 //sync(); 00069 m_delegater = NULL; 00070 } 00071 00072 public: 00073 void setDelegater(log_delegater<CharT>* delegater){m_delegater = delegater;} 00074 log_delegater<CharT>* getDelegater(){return m_delegater;} 00075 protected: 00076 int sync() 00077 { 00078 output_log_string(this->str().c_str()); 00079 str(std::basic_string<CharT>()); // Clear the string buffer 00080 00081 return 0; 00082 } 00083 00084 void output_log_string(const CharT *text) {if(m_delegater) m_delegater->log(text);} 00085 protected: 00086 log_delegater<CharT>* m_delegater; 00087 }; 00088 00090 //basic_logostream 00091 template<class CharT, class TraitsT = std::char_traits<CharT> > 00092 class basic_logostream : 00093 public std::basic_ostream<CharT, TraitsT> 00094 { 00095 public: 00096 00097 basic_logostream() : std::basic_ostream<CharT, TraitsT> 00098 (new basic_logbuf<CharT, TraitsT>()) 00099 { 00100 } 00101 basic_logostream(log_delegater<CharT>* delegater) : std::basic_ostream<CharT, TraitsT> 00102 (new basic_logbuf<CharT, TraitsT>(delegater)) 00103 { 00104 } 00105 ~basic_logostream() 00106 { 00107 delete this->rdbuf(); 00108 } 00109 public: 00110 void setDelegater(log_delegater<CharT>* delegater){((basic_logbuf<CharT, TraitsT>*)this->rdbuf())->setDelegater(delegater);} 00111 log_delegater<CharT>* getDelegater(){return ((basic_logbuf<CharT, TraitsT>*)this->rdbuf())->getDelegater();} 00112 public: 00113 }; 00114 00115 typedef basic_logostream<char> logostream; 00116 typedef basic_logostream<wchar_t> wlogostream; 00117 00119 //stream_delegater 00120 template<class CharT, class TraitsT = std::char_traits<CharT> > 00121 class stream_delegater: public log_delegater<CharT> 00122 { 00123 public: 00124 stream_delegater(std::basic_ostream<CharT,TraitsT>* os):m_ostream(os) 00125 { 00126 } 00127 ~stream_delegater() 00128 { 00129 m_ostream = NULL; 00130 } 00131 public: 00132 void log(const CharT* text) 00133 { 00134 if(m_ostream) 00135 (*m_ostream) << text; 00136 } 00137 protected: 00138 std::basic_ostream<CharT,TraitsT>* m_ostream; 00139 }; 00140 00142 //file_delegater 00143 template<class CharT, class TraitsT = std::char_traits<CharT> > 00144 class file_delegater: public log_delegater<CharT> 00145 { 00146 public: 00147 file_delegater(const char* logfile) 00148 { 00149 m_ostream.open(logfile,ios_base::out); 00150 if(!m_ostream.is_open()) 00151 { 00152 FIRTEX_THROW2(FILEIO_ERROR,_T("open log file error.")); 00153 } 00154 } 00155 ~file_delegater() 00156 { 00157 if(m_ostream.is_open()) 00158 { 00159 m_ostream.close(); 00160 } 00161 } 00162 public: 00163 void log(const CharT* text); 00164 protected: 00165 std::basic_ofstream<CharT,TraitsT> m_ostream; 00166 }; 00167 00168 /*template<> 00169 inline file_delegater<char>::file_delegater(const char* logfile) 00170 { 00171 m_ostream.open(logfile,ios_base::out); 00172 if(!m_ostream.is_open()) 00173 { 00174 FIRTEX_THROW2(FILEIO_ERROR,_T("open log file error.")); 00175 } 00176 } 00177 template<> 00178 inline file_delegater<wchar_t>::file_delegater(const wchar_t* logfile) 00179 { 00180 m_ostream.open(logfile,ios_base::out); 00181 if(!m_ostream.is_open()) 00182 { 00183 FIRTEX_THROW2(FILEIO_ERROR,_T("open log file error.")); 00184 } 00185 } */ 00186 00187 template<> 00188 inline void file_delegater<char>::log(const char* text) 00189 { 00190 if(text) 00191 { 00192 m_ostream << text; 00193 } 00194 } 00195 template<> 00196 inline void file_delegater<wchar_t>::log(const wchar_t* text) 00197 { 00198 if(text) 00199 m_ostream << text; 00200 } 00202 //basic_logger 00203 typedef unsigned int level_type; 00204 00205 #define LOG_DEFINE_LEVEL(lvl, value) namespace level { const level_type lvl = (level_type)(value); } 00206 00207 LOG_DEFINE_LEVEL(disable_all, -1) 00208 LOG_DEFINE_LEVEL(default_, 1000) 00209 // alias... 00210 LOG_DEFINE_LEVEL(default_level, 1000) 00211 LOG_DEFINE_LEVEL(enable_all, 0) 00212 00213 LOG_DEFINE_LEVEL(fatal, 2000) 00214 LOG_DEFINE_LEVEL(err, 1600) 00215 LOG_DEFINE_LEVEL(warn, 1200) 00216 LOG_DEFINE_LEVEL(info, 1000) 00217 LOG_DEFINE_LEVEL(dbg, 800) 00218 00219 00220 #define FIRTEX_LOG(logger,log_level)\ 00221 if(tlogger::isEnabled(log_level) == false) ; else logger.level(log_level) 00222 00223 #define ENABLE_LOGS(log_level) basic_logger::enableLogs(log_level); 00224 00225 template<class CharT, class TraitsT = std::char_traits<CharT> > 00226 class basic_logger : public basic_logostream<CharT,TraitsT> 00227 { 00228 public: 00229 basic_logger() 00230 { 00231 m_curLogLevel = level::info; 00232 m_delegater = new stream_delegater<CharT>(&std::cout); 00233 setDelegater(m_delegater); 00234 m_ownDelegater = true; 00235 } 00236 basic_logger(basic_ostream<CharT,TraitsT>& os) 00237 { 00238 m_curLogLevel = level::info; 00239 m_delegater = new stream_delegater<CharT>(&os); 00240 setDelegater(m_delegater); 00241 } 00242 ~basic_logger() 00243 { 00244 this->flush(); 00245 if((m_ownDelegater == true) && m_delegater) 00246 { 00247 delete m_delegater; 00248 m_delegater = NULL; 00249 } 00250 } 00251 public: 00252 basic_logger<CharT,TraitsT>& level(level_type level) 00253 { 00254 m_curLogLevel = level; 00255 //if(m_prefix.empty() == false) 00256 //(*this) << m_prefix; 00257 return *this; 00258 } 00259 00260 bool canLog(){return (m_curLogLevel >= basic_logger::m_logLevel);} 00261 00262 static bool isEnabled(level_type lvl){return (lvl >= m_logLevel);} 00263 static void enableLogs(level_type lvl){m_logLevel = lvl;} 00264 static void enableLogs(const basic_string<CharT,TraitsT>& logstr) 00265 { 00266 if(logstr == _T("default_level")) 00267 { 00268 enableLogs(level::default_level); 00269 } 00270 else if(logstr == _T("enable_all")) 00271 { 00272 enableLogs(level::enable_all); 00273 } 00274 else if(logstr == _T("disable_all")) 00275 { 00276 enableLogs(level::disable_all); 00277 } 00278 else if(logstr == _T("fatal")) 00279 { 00280 enableLogs(level::fatal); 00281 } 00282 else if(logstr == _T("err")) 00283 { 00284 enableLogs(level::err); 00285 } 00286 else if(logstr == _T("warn")) 00287 { 00288 enableLogs(level::warn); 00289 } 00290 else if(logstr == _T("info")) 00291 { 00292 enableLogs(level::info); 00293 } 00294 else if(logstr == _T("dbg")) 00295 { 00296 enableLogs(level::dbg); 00297 } 00298 else 00299 { 00300 enableLogs(level::default_level); 00301 } 00302 } 00303 public: 00308 void reset(basic_ostream<CharT,TraitsT>& os) 00309 { 00310 if((m_ownDelegater == true) && m_delegater) 00311 { 00312 delete m_delegater; 00313 } 00314 m_delegater = new stream_delegater<CharT>(&os); 00315 setDelegater(m_delegater); 00316 m_ownDelegater = true; 00317 } 00318 00323 void reset(const CharT* logfile) 00324 { 00325 if((m_ownDelegater == true) && m_delegater) 00326 { 00327 delete m_delegater; 00328 } 00329 m_delegater = new file_delegater<CharT>(logfile); 00330 setDelegater(m_delegater); 00331 m_ownDelegater = true; 00332 } 00333 00338 void reset(log_delegater<CharT>* delegater) 00339 { 00340 if((m_ownDelegater == true) && m_delegater) 00341 { 00342 delete m_delegater; 00343 } 00344 m_delegater = delegater; 00345 setDelegater(m_delegater); 00346 m_ownDelegater = false; 00347 } 00348 protected: 00349 log_delegater<CharT>* m_delegater; 00350 level_type m_curLogLevel; 00351 bool m_ownDelegater; 00352 00353 basic_string<CharT> m_prefix; 00354 00355 static level_type m_logLevel; 00356 }; 00358 // 00359 00360 00361 00362 typedef basic_logger<char> logger; 00363 typedef basic_logger<wchar_t> wlogger; 00364 #ifdef _UNICODE 00365 typedef wlogger tlogger; 00366 #else 00367 typedef logger tlogger; 00368 #endif 00369 } 00370 } 00371 00372 #endif
http://www.firtex.org http://www.sourceforge.net/projects/firtex