#pragma once #include #include #include #ifdef PLOG_DEFAULT_INSTANCE // for backward compatibility # define PLOG_DEFAULT_INSTANCE_ID PLOG_DEFAULT_INSTANCE #endif #ifndef PLOG_DEFAULT_INSTANCE_ID # define PLOG_DEFAULT_INSTANCE_ID 0 #endif namespace plog { template class PLOG_LINKAGE Logger : public util::Singleton >, public IAppender { public: Logger(Severity maxSeverity = none) : m_maxSeverity(maxSeverity) { } Logger& addAppender(IAppender* appender) { assert(appender != this); m_appenders.push_back(appender); return *this; } Severity getMaxSeverity() const { return m_maxSeverity; } void setMaxSeverity(Severity severity) { m_maxSeverity = severity; } bool checkSeverity(Severity severity) const { return severity <= m_maxSeverity; } virtual void write(const Record& record) PLOG_OVERRIDE { if (checkSeverity(record.getSeverity())) { *this += record; } } void operator+=(const Record& record) { for (std::vector::iterator it = m_appenders.begin(); it != m_appenders.end(); ++it) { (*it)->write(record); } } private: Severity m_maxSeverity; #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable:4251) // needs to have dll-interface to be used by clients of class #endif std::vector m_appenders; #ifdef _MSC_VER # pragma warning(pop) #endif }; template inline Logger* get() { return Logger::getInstance(); } inline Logger* get() { return Logger::getInstance(); } }