diff options
-rw-r--r-- | include/inspircd.h | 5 | ||||
-rw-r--r-- | include/logger.h | 35 | ||||
-rw-r--r-- | src/logger.cpp | 66 |
3 files changed, 102 insertions, 4 deletions
diff --git a/include/inspircd.h b/include/inspircd.h index 71a809be9..cc474dbfb 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -29,9 +29,6 @@ #include <time.h> #include <stdarg.h> - -//#include <string> -//#include <sstream> #include "inspircd_config.h" #include "uid.h" #include "users.h" @@ -39,6 +36,7 @@ #include "timer.h" #include "hashcomp.h" #include "typedefs.h" +#include "logger.h" #include "usermanager.h" #include "socket.h" #include "ctables.h" @@ -49,7 +47,6 @@ #include "cull_list.h" #include "filelogger.h" #include "caller.h" -//#include "inspsocket.h" #include "modules.h" #include "configreader.h" #include "inspstring.h" diff --git a/include/logger.h b/include/logger.h index 5b8929d37..1e043f4f1 100644 --- a/include/logger.h +++ b/include/logger.h @@ -11,3 +11,38 @@ * --------------------------------------------------- */ +#ifndef __LOGMANAGER_H +#define __LOGMANAGER_H + +class CoreExport LogStream : public classbase +{ + private: + InspIRCd *ServerInstance; + std::string type; + public: + LogStream(InspIRCd *Instance, const std::string &type) + { + this->ServerInstance = Instance; + this->type = type; + } + + virtual void OnLog(int loglevel, const std::string &msg); +}; + +class CoreExport LogManager : public classbase +{ + private: + InspIRCd *ServerInstance; + std::map<std::string, std::vector<LogStream *> > LogStreams; + public: + LogManager(InspIRCd *Instance) + { + ServerInstance = Instance; + } + + bool AddLogType(const std::string &type, LogStream *l); + bool DelLogType(const std::string &type, LogStream *l); + void Log(const std::string &type, int loglevel, const std::string &msg); +}; + +#endif diff --git a/src/logger.cpp b/src/logger.cpp index 690c1a5d9..458dcf5e0 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -41,3 +41,69 @@ * can we accomplish this easily? I guess with a map of pre-loved logpaths, and a pointer of FILE *.. * */ + +bool LogManager::AddLogType(const std::string &type, LogStream *l) +{ + std::map<std::string, std::vector<LogStream *> >::iterator i = LogStreams.find(type); + + if (i != LogStreams.end()) + i->second.push_back(l); + else + { + std::vector<LogStream *> v; + v.push_back(l); + LogStreams[type] = v; + } + + return true; +} + +bool LogManager::DelLogType(const std::string &type, LogStream *l) +{ + std::map<std::string, std::vector<LogStream *> >::iterator i = LogStreams.find(type); + + if (i != LogStreams.end()) + { + std::vector<LogStream *>::iterator it = i->second.begin(); + + while (it != i->second.end()) + { + if (*it == l) + { + i->second.erase(it); + + if (i->second.size() == 0) + { + LogStreams.erase(i); + } + + delete l; + return true; + } + } + } + + return false; +} + +void LogManager::Log(const std::string &type, int loglevel, const std::string &msg) +{ + std::map<std::string, std::vector<LogStream *> >::iterator i = LogStreams.find(type); + + if (i != LogStreams.end()) + { + std::vector<LogStream *>::iterator it = i->second.begin(); + + while (it != i->second.end()) + { + (*it)->OnLog(loglevel, msg); + } + + return; + } + + // blurp, no handler for this type + return; +} + + |