FirteX-高性能全文索引和检索平台

API Documentation


首页 | 名字空间列表 | 类继承关系 | 组合类型列表 | $(BL\录(B | 文件列表 | 名字空间成员 | 组合类型成员 | 文件成员

logger.h

浏览该文件的文档。
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