ULogger.h
Go to the documentation of this file.
00001 /*
00002 *  utilite is a cross-platform library with
00003 *  useful utilities for fast and small developing.
00004 *  Copyright (C) 2010  Mathieu Labbe
00005 *
00006 *  utilite is free library: you can redistribute it and/or modify
00007 *  it under the terms of the GNU Lesser General Public License as published by
00008 *  the Free Software Foundation, either version 3 of the License, or
00009 *  (at your option) any later version.
00010 *
00011 *  utilite is distributed in the hope that it will be useful,
00012 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 *  GNU Lesser General Public License for more details.
00015 *
00016 *  You should have received a copy of the GNU Lesser General Public License
00017 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
00018 */
00019 
00020 #ifndef ULOGGER_H
00021 #define ULOGGER_H
00022 
00023 #include "rtabmap/utilite/UtiLiteExp.h" // DLL export/import defines
00024 
00025 #include "rtabmap/utilite/UMutex.h"
00026 #include "rtabmap/utilite/UDestroyer.h"
00027 #include "rtabmap/utilite/UEvent.h"
00028 #include "rtabmap/utilite/UException.h"
00029 
00030 #include <stdio.h>
00031 #include <time.h>
00032 #include <string>
00033 #include <vector>
00034 #include <map>
00035 #include <set>
00036 
00037 #include <stdarg.h>
00038 
00048 /*
00049  * Convenient macros for logging...
00050  */
00051 #define ULOGGER_LOG(level, ...) ULogger::write(level, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
00052 
00053 #define ULOGGER_DEBUG(...)   ULOGGER_LOG(ULogger::kDebug,   __VA_ARGS__)
00054 #define ULOGGER_INFO(...)    ULOGGER_LOG(ULogger::kInfo,    __VA_ARGS__)
00055 #define ULOGGER_WARN(...)        ULOGGER_LOG(ULogger::kWarning, __VA_ARGS__)
00056 #define ULOGGER_ERROR(...)   ULOGGER_LOG(ULogger::kError,   __VA_ARGS__)
00057 #define ULOGGER_FATAL(...)   ULOGGER_LOG(ULogger::kFatal,   __VA_ARGS__) // Throw UException
00058 
00059 #define UDEBUG(...)   ULOGGER_DEBUG(__VA_ARGS__)
00060 #define UINFO(...)    ULOGGER_INFO(__VA_ARGS__)
00061 #define UWARN(...)        ULOGGER_WARN(__VA_ARGS__)
00062 #define UERROR(...)   ULOGGER_ERROR(__VA_ARGS__)
00063 #define UFATAL(...)   ULOGGER_FATAL(__VA_ARGS__) // Throw UException
00064 
00065 // Throw UException
00066 #define UASSERT(condition) if(!(condition)) ULogger::write(ULogger::kFatal, __FILE__, __LINE__, __FUNCTION__, "Condition (%s) not met!", #condition)
00067 #define UASSERT_MSG(condition, msg_str) if(!(condition)) ULogger::write(ULogger::kFatal, __FILE__, __LINE__, __FUNCTION__, "Condition (%s) not met! [%s]", #condition, msg_str)
00068 
00121 class ULogEvent : public UEvent
00122 {
00123 public:
00129         ULogEvent(const std::string & msg, int level) :
00130                 UEvent(level),
00131                 msg_(msg)
00132         {}
00133         virtual ~ULogEvent() {}
00137         const std::string & getMsg() const {return msg_;}
00141         virtual std::string getClassName() const {return "ULogEvent";}
00142 private:
00143         std::string msg_;
00144 };
00145 
00229 class UTILITE_EXP ULogger
00230 {
00231 
00232 public:
00236     static const std::string kDefaultLogFileName;
00237 
00244     enum Type{kTypeNoLog, kTypeConsole, kTypeFile};
00245 
00252     enum Level{kDebug, kInfo, kWarning, kError, kFatal};
00253 
00265     static void setType(Type type, const std::string &fileName = kDefaultLogFileName, bool append = true);
00266     static Type type() {return type_;}
00267 
00268     // Setters
00273     static void setPrintTime(bool printTime) {printTime_ = printTime;}
00274     static bool isPrintTime() {return printTime_;}
00275 
00280     static void setPrintLevel(bool printLevel) {printLevel_ = printLevel;}
00281     static bool isPrintLevel() {return printLevel_;}
00282 
00287     static void setPrintEndline(bool printEndline) {printEndline_ = printEndline;}
00288     static bool isPrintEndLine() {return printEndline_;}
00289 
00295         static void setPrintColored(bool printColored) {printColored_ = printColored;}
00296         static bool isPrintColored() {return printColored_;}
00297 
00302     static void setPrintWhere(bool printWhere) {printWhere_ = printWhere;}
00303     static bool isPrintWhere() {return printWhere_;}
00304 
00309         static void setPrintThreadId(bool printThreadId) {printThreadID_ = printThreadId;}
00310         static bool isPrintThreadId() {return printThreadID_;}
00311 
00316     static void setPrintWhereFullPath(bool printWhereFullPath) {printWhereFullPath_ = printWhereFullPath;}
00317     static bool isPrintWhereFullPath() {return printWhereFullPath_;}
00318 
00325     static void setBuffered(bool buffered);
00326     static bool isBuffered() {return buffered_;}
00327 
00339     static void setLevel(ULogger::Level level) {level_ = level;}
00340     static ULogger::Level level() {return level_;}
00341 
00348         static void setEventLevel(ULogger::Level eventSentLevel) {eventLevel_ = eventSentLevel;}
00349         static ULogger::Level eventLevel() {return eventLevel_;}
00350 
00354         static void setTreadIdFilter(const std::set<unsigned long> & ids) {threadIdFilter_ = ids;}
00355         static void setTreadIdFilter(const std::vector<std::string> & ids);
00356         static const std::set<unsigned long> & getTreadIdFilter() {return threadIdFilter_;}
00357 
00362         static void registerCurrentThread(const std::string & name);
00363         static void unregisterCurrentThread();
00364         static std::map<std::string, unsigned long> getRegisteredThreads();
00365 
00369     static void reset();
00370 
00375         static void flush();
00376 
00383     static void write(const char* msg, ...);
00384 
00385     /*
00386      * Write a message to logger: use UDEBUG(), UINFO(), UWARN(), UERROR() or UFATAL() instead.
00387      * @param level the log level of this message
00388      * @param file the file path
00389      * @param line the line in the file
00390      * @param function the function name in which the message is logged
00391      * @param msg the message to write
00392      * @param ... the variable arguments
00393      */
00394     static void write(ULogger::Level level,
00395                 const char * file,
00396                 int line,
00397                 const char *function,
00398                 const char* msg,
00399                 ...);
00400 
00406     static int getTime(std::string &timeStr);
00407 
00408 protected:
00409     /*
00410      * This method is used to have a reference on the 
00411      * Logger. When no Logger exists, one is 
00412      * created. There is only one instance in the application.
00413      * Must be protected by loggerMutex_.
00414      * See the Singleton pattern for further explanation.
00415      *
00416      * @return the reference on the Logger
00417      */
00418     static ULogger* getInstance();
00419 
00420     /*
00421      * Called only once in getInstance(). It can't be instanciated 
00422      * by the user.
00423      *
00424      * @see getInstance()
00425      */
00426     ULogger() {}
00427 
00428     /*
00429      * Only called by a Destroyer.
00430      * @see Destroyer
00431      */
00432     virtual ~ULogger();
00433 
00434     /*
00435          * Flush buffered messages
00436          */
00437         void _flush();
00438 
00439     /*
00440      * A Destroyer is used to remove a dynamicaly created 
00441      * Singleton. It is friend here to have access to the 
00442      * destructor.
00443      *
00444      * @see Destroyer
00445      */
00446     friend class UDestroyer<ULogger>;
00447     
00448     /*
00449      * The log file name.
00450      */
00451     static std::string logFileName_;
00452 
00453     /*
00454      * Default true, it doesn't overwrite the file.
00455      */
00456     static bool append_;
00457     
00458 private:
00459     /*
00460      * Create an instance according to type. See the Abstract factory 
00461      * pattern for further explanation.
00462      * @see type_
00463      * @return the reference on the new logger
00464      */
00465     static ULogger* createInstance();
00466 
00467     /*
00468      * Write a message on the output with the format :
00469      * "A message". Inherited class
00470      * must override this method to output the message. It 
00471      * does nothing by default.
00472      * @param msg the message to write.
00473      * @param arg the variable arguments
00474      */
00475     virtual void _write(const char* msg, va_list arg) {} // Do nothing by default
00476     virtual void _writeStr(const char* msg) {} // Do nothing by default
00477 
00478 private:
00479     /*
00480      * The Logger instance pointer.
00481      */
00482     static ULogger* instance_;
00483 
00484     /*
00485      * The Logger's destroyer
00486      */
00487     static UDestroyer<ULogger> destroyer_;
00488 
00489     /*
00490      * If the logger prints the time for each message. 
00491      * Default is true.
00492      */
00493     static bool printTime_;
00494 
00495     /*
00496      * If the logger prints the level for each message. 
00497      * Default is true.
00498      */
00499     static bool printLevel_;
00500 
00501     /*
00502      * If the logger prints the end line for each message. 
00503      * Default is true.
00504      */
00505     static bool printEndline_;
00506 
00507     /*
00508          * If the logger prints text with color.
00509          * Default is true.
00510          */
00511     static bool printColored_;
00512 
00513     /*
00514          * If the logger prints where the message is logged (fileName::function():line).
00515          * Default is true.
00516          */
00517     static bool printWhere_;
00518 
00519     /*
00520          * If the logger prints the full path of the source file
00521          * where the message is written. Only works when
00522          * "printWhere_" is true.
00523          * Default is false.
00524          */
00525     static bool printWhereFullPath_;
00526 
00527     /*
00528          * If the logger prints the thread ID.
00529          * Default is false.
00530          */
00531     static bool printThreadID_;
00532 
00533     /*
00534          * If the logger limit the size of the "where" path to
00535          * characters. If the path is over 8 characters, a "~"
00536          * is added. Only works when "printWhereFullPath_" is false.
00537          * Default is false.
00538          */
00539     static bool limitWhereLength_;
00540 
00541     /*
00542      * The type of the logger.
00543      */
00544     static Type type_;
00545 
00546     /*
00547          * The severity of the log.
00548          */
00549     static Level level_;
00550 
00551     /*
00552          * The severity at which the message is also sent in a ULogEvent.
00553          */
00554         static Level eventLevel_;
00555 
00556     static const char * levelName_[5];
00557 
00558     /*
00559      * Mutex used when accessing public functions.
00560      */
00561     static UMutex loggerMutex_;
00562 
00563     /*
00564          * If the logger prints messages only when ULogger::flush() is called.
00565          * Default is false.
00566          */
00567         static bool buffered_;
00568 
00569         static std::string bufferedMsgs_;
00570 
00571         static std::set<unsigned long> threadIdFilter_;
00572         static std::map<std::string, unsigned long> registeredThreads_;
00573 };
00574 
00575 #endif // ULOGGER_H


rtabmap
Author(s): Mathieu Labbe
autogenerated on Thu Jun 6 2019 21:59:32