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 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 std::vector<IAppender*> m_appenders; 65 }; 66 67 template<int instanceId> get()68 inline Logger<instanceId>* get() 69 { 70 return Logger<instanceId>::getInstance(); 71 } 72 get()73 inline Logger<PLOG_DEFAULT_INSTANCE_ID>* get() 74 { 75 return Logger<PLOG_DEFAULT_INSTANCE_ID>::getInstance(); 76 } 77 } 78