Go to the documentation of this file.00001 #ifndef logging_logger_H
00002 #define logging_logger_H
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00032 #ifndef __cplusplus
00033 #error This is a C++ include file and cannot be used from plain C
00034 #endif
00035 
00036 #include <string>
00037 #include <lokiSmartPtr.h>
00038 #include <list>
00039 #include "loggingBaseLog.h"
00040 #include "loggingHandler.h"
00041 #include <ace/Thread_Mutex.h>
00042 #include <Singleton.h>
00043 #include <Thread_Manager.h>   
00044 
00045 namespace Logging 
00046 {
00047 
00048     
00055     class Logger : public virtual BaseLog
00056     {
00057       public:
00058         
00060 #ifndef MAKE_VXWORKS
00061         typedef Loki::SmartPtr<Logger, 
00062                                Loki::RefCountedMTAdj<Loki::ObjectLevelLockable>::RefCountedMT,
00063                                Loki::AllowConversion,
00064                                Loki::NoCheck,
00065                                Loki::DefaultSPStorage> LoggerSmartPtr;
00066 #else
00067         typedef Loki::SmartPtr<Logger, 
00068                                RefCountedMT,
00069                                Loki::AllowConversion,
00070                                Loki::NoCheck,
00071                                Loki::DefaultSPStorage> LoggerSmartPtr;
00072 #endif
00073 
00074         
00075         typedef std::list<Logger*> LoggerList;
00076         
00077         
00078         typedef void (*ConfigureLoggerFunction)(const std::string& loggerName);
00079         
00086         virtual LoggerSmartPtr
00087         getLogger(const std::string &loggerName) = 0;
00088 
00089     int getLocalLevel();
00090     int getRemoteLevel();
00091     int
00092     getLocalLevel(const std::string &loggerName);
00093     int
00094     getRemoteLevel(const std::string &loggerName);
00099         static LoggerSmartPtr getAnonymousLogger();
00100 
00106         static void     setAnonymousLogger(LoggerSmartPtr anonyLogger);
00107         
00113         static LoggerSmartPtr getStaticLogger();
00114 
00120         static void     setStaticLogger(LoggerSmartPtr anonyLogger);
00121         
00127         static LoggerSmartPtr getGlobalLogger();
00128         
00134         static void setGlobalLogger(LoggerSmartPtr globalLogger);
00135         
00141         virtual std::string     getName() const;
00142         
00146         virtual ~Logger();
00147         
00156         virtual void
00157         addHandler(Handler::HandlerSmartPtr newHandler_p);
00158         
00165         virtual bool 
00166         removeHandler(const std::string &handlerName);
00167         
00169         virtual void
00170         log(const LogRecord &lr);
00171 
00175         virtual void
00176         log(Priority priority,
00177             const std::string &message,
00178             const std::string &file,
00179             unsigned long line,
00180             const std::string &method)
00181             {
00182                 BaseLog::log(priority, message, file, line, method);
00183             }
00184 
00193         virtual void
00194         log(Priority priority,
00195             const std::string &message)
00196             {
00197                 log(priority,
00198                     message,
00199                     FIELD_UNAVAILABLE,
00200                     0UL,
00201                     FIELD_UNAVAILABLE);
00202             }
00203         
00209         virtual void 
00210         setName(const std::string &newName);
00211 
00217         virtual void
00218         setLevels(Priority remotePriority,Priority localPriority, int type);
00219         
00226         virtual void
00227         setLevels(const std::string &loggerName, Priority remotePriority,Priority localPriority, int type);
00228     
00229     void setLevelsLoggerHandlers(Priority remotePriority,Priority localPriority, int type);
00235         virtual bool
00236         exists(const std::string &loggerName);
00237 
00242         virtual std::list<std::string>
00243         getLoggerNames();
00244 
00248         static void
00249         setConfigureLoggerFunction(ConfigureLoggerFunction configureLoggerFunction) {configureLoggerFunction_m=configureLoggerFunction;}
00250         
00254         static void
00255         configureLogger(const std::string& loggerName)
00256         {
00257                 if (configureLoggerFunction_m)
00258                         (*configureLoggerFunction_m)(loggerName);
00259         }
00260         
00261       protected:
00262         
00269         Logger(const std::string &loggerName);
00270 
00278         virtual void
00279         acquireHandlerMutex() {}
00280 
00288         virtual void 
00289         releaseHandlerMutex() {}
00290         
00291       private:
00292         
00294         std::string loggerName_m;
00295         
00300         std::list<Handler::HandlerSmartPtr> handlers_m;
00301 
00302         class Logger_ptr{
00303                 public:
00304                         Logger_ptr(){globalLogger_m=(Logger *)0;anonymousLogger_m=(Logger *)0;staticLogger_m=(Logger *)0;}
00305                         ~Logger_ptr(){globalLogger_m=(Logger *)0;anonymousLogger_m=(Logger *)0;staticLogger_m=(Logger *)0;}
00310                         LoggerSmartPtr globalLogger_m;
00315                         LoggerSmartPtr anonymousLogger_m;
00316                         
00320                         LoggerSmartPtr staticLogger_m;
00321                         
00325                         LoggerList loggers_m;
00326         };
00327 
00332         static ACE_Thread_Mutex loggersMutex_m;
00333 
00337         static ConfigureLoggerFunction configureLoggerFunction_m;
00338 
00339     };
00340     
00341 };
00342 
00343 #endif