#ifndef __LOGGER_H #define __LOGGER_H #include "LoggerExportable.hpp" #include "Singleton.hpp" #include "ScopedPtr.hpp" #include enum LogLevel { logNONE, logFATAL, logCRITICAL, logERROR, logWARNING, logNOTICE, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4 }; class LogSink; class LoggerImpl; class Logger : public Singleton< Logger > { public: DECLARE_SINGLETON( Logger ) LOGGER_DLL_VISIBLE void addSink( LogSink *sink ); LOGGER_DLL_VISIBLE void removeSink( LogSink *sink ); LOGGER_DLL_VISIBLE void log( const LogLevel level, const std::string &msg ); LOGGER_DLL_VISIBLE static std::string toString( const LogLevel level ); LOGGER_DLL_VISIBLE static LogLevel fromString( const std::string &s ); LOGGER_DLL_VISIBLE void openConsoleLog( const LogLevel level ); LOGGER_DLL_VISIBLE void openFileLog( const LogLevel level, const std::string &filename ); LOGGER_DLL_VISIBLE void openSyslog( const LogLevel level, const std::string &ident, const std::string &facility ); LOGGER_DLL_VISIBLE void openWinDbgLog( const LogLevel level ); protected: LOGGER_DLL_VISIBLE Logger( ); LOGGER_DLL_VISIBLE virtual ~Logger( ); private: scopedPtr< LoggerImpl > m_impl; }; DEFINE_SINGLETON( Logger ) class LogStream : private noncopyable, public std::ostringstream { public: LOGGER_DLL_VISIBLE LogStream( Logger &logger, const LogLevel level ); LOGGER_DLL_VISIBLE ~LogStream( ); LOGGER_DLL_VISIBLE std::ostream &get( ); private: LogStream( ); LogStream( const LogStream & ); LogStream &operator=( const LogStream &); private: Logger &m_logger; LogLevel m_level; }; #define LOG( level ) LogStream( Logger::instance( ), level ).get( ) #endif