1 #pragma once 2 #include <plog/Appenders/IAppender.h> 3 #include <plog/Util.h> 4 #include <vector> 5 6 #ifdef PLOG_DEFAULT_INSTANCE // for backward compatibility 7 # define PLOG_DEFAULT_INSTANCE_ID PLOG_DEFAULT_INSTANCE 8 #endif 9 10 #ifndef PLOG_DEFAULT_INSTANCE_ID 11 # define PLOG_DEFAULT_INSTANCE_ID 0 12 #endif 13 14 namespace plog 15 { 16 template<int instanceId> 17 class PLOG_LINKAGE Logger : public util::Singleton<Logger<instanceId> >, public IAppender 18 { 19 public: m_maxSeverity(maxSeverity)20 Logger(Severity maxSeverity = none) : m_maxSeverity(maxSeverity) 21 { 22 } 23 addAppender(IAppender * appender)24 Logger& addAppender(IAppender* appender) 25 { 26 assert(appender != this); 27 m_appenders.push_back(appender); 28 return *this; 29 } 30 getMaxSeverity()31 Severity getMaxSeverity() const 32 { 33 return m_maxSeverity; 34 } 35 setMaxSeverity(Severity severity)36 void setMaxSeverity(Severity severity) 37 { 38 m_maxSeverity = severity; 39 } 40 checkSeverity(Severity severity)41 bool checkSeverity(Severity severity) const 42 { 43 return severity <= m_maxSeverity; 44 } 45 write(const Record & record)46 virtual void write(const Record& record) 47 { 48 if (checkSeverity(record.getSeverity())) 49 { 50 *this += record; 51 } 52 } 53 54 void operator+=(const Record& record) 55 { 56 for (std::vector<IAppender*>::iterator it = m_appenders.begin(); it != m_appenders.end(); ++it) 57 { 58 (*it)->write(record); 59 } 60 } 61 62 private: 63 Severity m_maxSeverity; 64 #ifdef _MSC_VER 65 # pragma warning(push) 66 # pragma warning(disable:4251) // needs to have dll-interface to be used by clients of class 67 #endif 68 std::vector<IAppender*> m_appenders; 69 #ifdef _MSC_VER 70 # pragma warning(pop) 71 #endif 72 }; 73 74 template<int instanceId> get()75 inline Logger<instanceId>* get() 76 { 77 return Logger<instanceId>::getInstance(); 78 } 79 get()80 inline Logger<PLOG_DEFAULT_INSTANCE_ID>* get() 81 { 82 return Logger<PLOG_DEFAULT_INSTANCE_ID>::getInstance(); 83 } 84 } 85